UnionWarLogic.lua 52 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664
  1. local Msg = require("core.Msg")
  2. local InnerMsg = require("core.InnerMsg")
  3. local ObjHuman = require("core.ObjHuman")
  4. local Util = require("common.Util")
  5. local Config = require("Config")
  6. local Lang = require("common.Lang")
  7. local LuaMongo = _G.lua_mongo
  8. local DB = require("common.DB")
  9. local RoleDBLogic = require("role.RoleDBLogic")
  10. local CombatLogic = require("combat.CombatLogic")
  11. local CombatPosLogic = require("combat.CombatPosLogic")
  12. local CombatDefine = require("combat.CombatDefine")
  13. local UnionWarDBLogic = require("union.UnionWarDBLogic")
  14. local UnionWarMiddleLogic = require("union.UnionWarMiddleLogic")
  15. local HeroGrid = require("hero.HeroGrid")
  16. local Grid = require("bag.Grid")
  17. local BagLogic = require("bag.BagLogic")
  18. local Broadcast = require("broadcast.Broadcast")
  19. local RoleDefine = require("role.RoleDefine")
  20. local UnionDBLogic = require("union.UnionDBLogic")
  21. local RoleLogic = require("role.RoleLogic")
  22. local MailManager = require("mail.MailManager")
  23. local BattleLogic = require("battle.BattleLogic")
  24. local MailDefine = require("mail.MailIdDefine")
  25. local MailExcel = require("excel.mail").mail
  26. local MonsterOutExcel = require("excel.monster").monsterOut
  27. local UnionWarExcel = require("excel.unionWar")
  28. local RobotExcel = UnionWarExcel.robot
  29. local DefineConf = UnionWarExcel.define[1]
  30. local LvExcel = UnionWarExcel.lv
  31. local RankExcel = UnionWarExcel.rank
  32. local RoleSystemLogic = require("roleSystem.RoleSystemLogic")
  33. local RoleSystemDefine = require("roleSystem.RoleSystemDefine")
  34. local BillboardDB = require("billboard.BillboardDB")
  35. local BillboardDefine = require("billboard.BillboardDefine")
  36. local Broadcast = require("broadcast.Broadcast")
  37. local Timer = require("core.Timer")
  38. local MiddleConnect = require("middle.MiddleConnect")
  39. local WarOrder = require("shop.WarOrder")
  40. --活动阶段
  41. WDAY = {[1] = 1,[3] = 1,[5] = 1}
  42. --获取公会战阶段
  43. HOUR1 = {5,8} --确认
  44. HOUR2 = {8,12} --匹配
  45. HOUR3 = {12,20} --战斗
  46. HOUR4 = {20,24} --结算
  47. STATE0 = 0 --非活动阶段
  48. STATE1 = 1 --确认
  49. STATE2 = 2 --匹配
  50. STATE3 = 3 --战斗
  51. STATE4 = 4 --结算
  52. UNION_STATE1 = 1 --匹配成功
  53. UNION_STATE2 = 2 --确认不成功
  54. UNION_STATE3 = 3 --匹配不成功
  55. UNION_LV = 2 -- 公会等级条件
  56. UNION_HUOYUE = 5 --功会活跃人数条件
  57. HUOYUE_TIME = 86400
  58. UNION_FEIXU_CNT = 5 -- 废墟可挑战次数
  59. local CLAN_ORDER_TYPE = 3
  60. local function getLocalUnionWarData(localData,unionUuid)
  61. localData[unionUuid] = localData[unionUuid] or {member = {},memberCnt = 0,star = 0,cnt = 0,exp = 0,lv = 0,rank = {}}
  62. return localData[unionUuid]
  63. end
  64. local function getLocalMemberData(unionWarData,uuid)
  65. unionWarData.member[uuid] = unionWarData.member[uuid] or {name = "",cnt = 0,shop = {{},{}},chengjiu = {{},{}}}
  66. return unionWarData.member[uuid]
  67. end
  68. local function getUnionWarRankRewardID(rank)
  69. for k, v in ipairs(RankExcel) do
  70. if v.minRank <= rank and rank <= v.maxRank then
  71. return k
  72. end
  73. end
  74. return 0
  75. end
  76. local function getUnionWarData(human,memberData)
  77. if not human.db.unionWarData then
  78. human.db.unionWarData = {}
  79. human.db.unionWarData.shop = Util.copyTable(memberData.shop)
  80. human.db.unionWarData.upShopTime = memberData.upShopTime
  81. human.db.unionWarData.chengjiu = Util.copyTable(memberData.chengjiu)
  82. human.db.unionWarData.cnt = memberData.cnt
  83. end
  84. local now = os.time()
  85. if not human.db.unionWarData.upShopTime or human.db.unionWarData.upShopTime < now then
  86. human.db.unionWarData.upShopTime = Util.getWeekStartTime(now) + 86400 * 7
  87. human.db.unionWarData.shop[1] = {}
  88. end
  89. return human.db.unionWarData
  90. end
  91. function fontFakeObj(objList)
  92. local fakeList = {}
  93. for i = 1, CombatDefine.COMBAT_HERO_CNT do
  94. local obj = objList[i]
  95. if obj then
  96. fakeList[i] = {}
  97. fakeList[i] = Util.copyTable(obj)
  98. local fake = fakeList[i]
  99. fake.beSkillList = nil
  100. fake.skillList = nil
  101. fake.beSkillListTemp = nil
  102. fake.attrs = nil
  103. fake.attrs2 = {}
  104. fake.attrs2[RoleDefine.HP] = obj.attrs[RoleDefine.HP]
  105. fake.attrs2[RoleDefine.DEF] = obj.attrs[RoleDefine.DEF]
  106. fake.attrs2[RoleDefine.ATK] = obj.attrs[RoleDefine.ATK]
  107. fake.attrs2[RoleDefine.SPEED] = obj.attrs[RoleDefine.SPEED]
  108. fake.attrs2[RoleDefine.ATK_RATE] = obj.attrs[RoleDefine.SPEED_RATE]
  109. fake.attrs2[RoleDefine.DEF_RATE] = obj.attrs[RoleDefine.SPEED_RATE]
  110. fake.attrs2[RoleDefine.HP_RATE] = obj.attrs[RoleDefine.SPEED_RATE]
  111. fake.attrs2[RoleDefine.SPEED_RATE] = obj.attrs[RoleDefine.SPEED_RATE]
  112. -- fake.attrsting = ""
  113. -- for k,v in pairs(obj.attrs) do
  114. -- fake.attrsting = fake.attrsting .. "|" .. k.. "," .. v
  115. -- end
  116. end
  117. end
  118. return fakeList
  119. end
  120. local function getData(data)
  121. if data.lv < UNION_LV then return end
  122. local unionData = {member = {}}
  123. local len = 0
  124. local huoyueCnt = 0
  125. local sortList = {}
  126. local localData = UnionWarDBLogic.getLocalData()
  127. local unionUuid = data._id
  128. local now = os.time()
  129. local d = os.date("*t",now)
  130. d.hour = HOUR4[1]
  131. d.min = 0
  132. d.sec = 0
  133. local boxEndTime = os.time(d) + 24 * 3600
  134. local donateTime = Util.getDayStartTime(os.time())
  135. donateTime = donateTime - HUOYUE_TIME
  136. localData[unionUuid] = localData[unionUuid] or {member = {},memberCnt = 0,star = 0,cnt = 0,exp = 0,lv = 0,rank = {}}
  137. localData[unionUuid].rank = {}
  138. if localData[unionUuid].box and localData[unionUuid].box.endTime and localData[unionUuid].box.endTime < now then
  139. localData[unionUuid].isWin = nil
  140. localData[unionUuid].isMatch = nil
  141. end
  142. for k,v in pairs(data.member) do
  143. local db = RoleDBLogic.getDb(k)
  144. if db then
  145. if db.lastLoginTime and db.lastLoginTime >= donateTime then
  146. huoyueCnt = huoyueCnt + 1
  147. end
  148. local objList, helpList, rolebase,formation, jiban = CombatLogic.getHumanObjList({db = db},CombatDefine.COMBAT_TYPE3)
  149. if rolebase.zhandouli > 0 then
  150. len = len + 1
  151. local battleMonsterOutID = BattleLogic.getCombatMonsterOutID({db = db}, CombatDefine.DEFEND_SIDE)
  152. if not battleMonsterOutID then
  153. battleMonsterOutID = 10001
  154. end
  155. unionData.member[k] = {objList = objList,helpList = helpList,formation = formation, jiban = jiban , rolebase = rolebase,name = db.name ,attackStar = 0,defendStar = 3,defendCnt = 0,attackCnt = 0, jifen = 0,log = {},battleMonsterOutID = battleMonsterOutID} --
  156. sortList[len] = {k,rolebase.zhandouli}
  157. localData[unionUuid].member[k] = localData[unionUuid].member[k] or {name = db.name,cnt = 0,shop = {{},{}},chengjiu = {{},{}}}
  158. localData[unionUuid].member[k].join = 1
  159. localData[unionUuid].member[k].post = v.post
  160. localData[unionUuid].member[k].rolebase = rolebase
  161. localData[unionUuid].member[k].boxTime = boxEndTime
  162. end
  163. end
  164. end
  165. if len == 0 or huoyueCnt < UNION_HUOYUE then
  166. return
  167. end
  168. for k, v in pairs(localData[unionUuid].member) do
  169. if not data.member[k] then
  170. localData[unionUuid].member[k] = nil
  171. end
  172. end
  173. table.sort(sortList,function(a,b)
  174. return a[2] > b[2]
  175. end)
  176. for k,v in ipairs(sortList) do
  177. unionData.member[v[1]].index = k
  178. localData[unionUuid].rank[k] = {v[1],0,0}
  179. end
  180. unionData.memberCnt = len
  181. unionData.unionUuid = data._id
  182. unionData.name = data.name
  183. unionData.bannerID = data.bannerID
  184. unionData.lv = data.lv
  185. unionData.zhandouli = data.zhandouli
  186. unionData.svrName = Config.SVR_NAME
  187. unionData.svrIndex = Config.SVR_INDEX
  188. unionData.rank = BillboardDB.getRank(BillboardDefine.TYPE_UNION,data._id) or 0
  189. localData[unionUuid].memberCnt = len
  190. localData[unionUuid].star = 0
  191. return unionData
  192. end
  193. --重置公会战数据(资格确认)
  194. fileds = {unionUuid = 1,name = 1,bannerID = 1,lv = 1,zhandouli = 1,member = 1}
  195. local ToMidUnionList = nil
  196. function refreshData()
  197. print(" refreshData refreshData refreshData")
  198. ToMidUnionList = {}
  199. LuaMongo.find(DB.db_union,nil,fileds)
  200. local msgRet = InnerMsg.lw.LW_UNION_WAR_ADD
  201. msgRet.list = {}
  202. local len = 0
  203. local unionList = {}
  204. local unionUuid
  205. while true do
  206. local data = {}
  207. if not LuaMongo.next(data) then
  208. break
  209. end
  210. unionList[#unionList + 1] = data
  211. end
  212. for k,data in ipairs(unionList) do
  213. local unionData = getData(data)
  214. if unionData then
  215. unionUuid = unionData.unionUuid
  216. local toLen = #ToMidUnionList + 1
  217. ToMidUnionList[toLen] = {}
  218. ToMidUnionList[toLen].member = {}
  219. ToMidUnionList[toLen].unionUuid = unionUuid
  220. ToMidUnionList[toLen].member = Util.copyTable(unionData.member)
  221. unionData.member = {}
  222. len = len + 1
  223. msgRet.list[len] = unionData
  224. end
  225. if len >= 5 then
  226. InnerMsg.sendMsg(0, msgRet)
  227. Util.cleanTable(msgRet.list)
  228. len = 0
  229. end
  230. end
  231. if len >= 1 then
  232. InnerMsg.sendMsg(0, msgRet)
  233. end
  234. UnionWarDBLogic.updateDB()
  235. print(" Timer.addLater(1, sendUnionToMid) Timer.addLater(1, sendUnionToMid)")
  236. Timer.addLater(1, sendUnionToMid)
  237. end
  238. local function getSurCnt(member)
  239. local len = 0
  240. if not member then return len end
  241. for _ in pairs(member) do
  242. len = len + 1
  243. end
  244. return len
  245. end
  246. function sendUnionToMid()
  247. print(" sendUnionToMid , sendUnionToMid , sendUnionToMid")
  248. if ToMidUnionList and #ToMidUnionList > 0 then
  249. print(" sendUnionToMid sendUnionToMid sendUnionToMid", #ToMidUnionList)
  250. local data = ToMidUnionList[#ToMidUnionList]
  251. if data and data.unionUuid then
  252. local msgRet = InnerMsg.lw.LW_UNION_WAR_MEMBER
  253. msgRet.unionUuid = data.unionUuid
  254. msgRet.list = {}
  255. Util.cleanTable(msgRet.list)
  256. local len = 0
  257. local sendUuid = {}
  258. if #ToMidUnionList == 1 and getSurCnt(data.member) <= 10 then
  259. data.isEnd = 1
  260. end
  261. local isSend = false
  262. msgRet.isEnd = data.isEnd or 0
  263. for k,v in pairs(data.member) do
  264. len = len + 1
  265. msgRet.list[len] = {k,v}
  266. sendUuid[k] = 1
  267. if len >= 10 then
  268. -- Util.printTable(msgRet)
  269. InnerMsg.sendMsg(0, msgRet)
  270. Util.cleanTable(msgRet.list)
  271. isSend = true
  272. break
  273. end
  274. end
  275. if not isSend then
  276. -- Util.printTable(msgRet)
  277. InnerMsg.sendMsg(0, msgRet)
  278. Util.cleanTable(msgRet.list)
  279. end
  280. local surLen = 0
  281. for uuid in pairs(data.member) do
  282. if sendUuid[uuid] then
  283. data.member[uuid] = nil
  284. else
  285. surLen = surLen + 1
  286. end
  287. end
  288. print(" surLen surLen ", surLen)
  289. if surLen == 0 then
  290. ToMidUnionList[#ToMidUnionList] = nil
  291. print(" del ToMidUnionList !", #ToMidUnionList)
  292. end
  293. if #ToMidUnionList > 0 then
  294. Timer.addLater(1, sendUnionToMid)
  295. else
  296. ToMidUnionList = nil
  297. end
  298. end
  299. end
  300. end
  301. -- 匹配完成 各个单服 将匹配上的 公会标记 用于红点
  302. function middleUnionMatchFinish(msg)
  303. local localData = UnionWarDBLogic.getLocalData()
  304. for unionUuid in pairs(msg.list) do
  305. if localData[unionUuid] then
  306. localData[unionUuid].isMatch = true
  307. localData[unionUuid].matchTime = os.time()
  308. end
  309. end
  310. end
  311. function getState()
  312. local now = os.time()
  313. local d = os.date("*t",now)
  314. local wday = d.wday
  315. local h = d.hour
  316. -- 周一 周三 周五 公会战
  317. if WDAY[wday - 1] then
  318. if h >= HOUR1[1] and h < HOUR1[2] then
  319. return STATE1
  320. elseif h >= HOUR2[1] and h < HOUR2[2] then
  321. return STATE2
  322. elseif h >= HOUR3[1] and h < HOUR3[2] then
  323. return STATE3
  324. elseif h >= HOUR4[1] and h < HOUR4[2] then
  325. return STATE4
  326. end
  327. end
  328. return STATE0
  329. end
  330. function getEndTime(actState)
  331. local now = os.time()
  332. local d = os.date("*t",now)
  333. if actState == STATE0 then
  334. local wday = d.wday
  335. if wday < 6 then
  336. d.hour = HOUR2[2]
  337. local checkTime = os.time(d)
  338. return checkTime + 24 * 60 * 60 - now
  339. elseif wday == 6 then
  340. if actState < STATE3 then
  341. d.hour = HOUR2[2]
  342. else
  343. d.hour = HOUR3[2]
  344. end
  345. d.min = 0
  346. d.sec = 0
  347. local checkTime = os.time(d)
  348. return checkTime - now
  349. else
  350. local Monday = Util.getWeekStartTime()
  351. return Monday + 24 * 60 * 60 * 7 + HOUR2[2] * 3600 - now
  352. end
  353. else
  354. if actState < STATE3 then
  355. d.hour = HOUR2[2]
  356. else
  357. d.hour = HOUR3[2]
  358. end
  359. d.min = 0
  360. d.sec = 0
  361. local checkTime = os.time(d)
  362. return checkTime - now
  363. end
  364. end
  365. function getWarTime(human)
  366. local msgRet = Msg.gc.GC_UNION_WAR_TIME
  367. if MiddleConnect.IS_MIDDLE_CONNECT then
  368. local actState = getState()
  369. msgRet.actState = actState
  370. msgRet.time = getEndTime(actState)
  371. Msg.send(msgRet,human.fd)
  372. else
  373. msgRet.actState = 0
  374. msgRet.time = 0
  375. Msg.send(msgRet,human.fd)
  376. end
  377. end
  378. local function getChengjiuExcel(type)
  379. if type == 1 then
  380. return UnionWarExcel.chengjiu1
  381. else
  382. return UnionWarExcel.chengjiu2
  383. end
  384. end
  385. local function isDotChengjiu(human,localData,unionWarData,memberData,type)
  386. local ChengjiuExcel = getChengjiuExcel(type)
  387. if not memberData then
  388. --未参与公会战
  389. return
  390. end
  391. local getList,cnt
  392. local humanData = getUnionWarData(human,memberData)
  393. if type == 1 then
  394. cnt = humanData.cnt
  395. getList = humanData.chengjiu[1]
  396. else
  397. cnt = unionWarData.cnt
  398. getList = humanData.chengjiu[2]
  399. end
  400. for k, v in ipairs(ChengjiuExcel) do
  401. if not getList[k] and v.cnt <= cnt then
  402. return true
  403. end
  404. end
  405. end
  406. local function sendState(human,actState,unionState)
  407. local msgRet = Msg.gc.GC_UNION_WAR_STATE
  408. msgRet.actState = actState
  409. msgRet.unionState = unionState
  410. msgRet.winState = 0
  411. msgRet.cjDot = 0
  412. msgRet.zgDot = 0
  413. msgRet.shopDot = 0
  414. msgRet.fightDot = 0
  415. msgRet.pipeiDot = 0
  416. local localData = UnionWarDBLogic.getLocalData()
  417. local unionWarData = getLocalUnionWarData(localData,human.db.unionUuid)
  418. local memberData = getLocalMemberData(unionWarData,human.db._id)
  419. if unionWarData and memberData and isDotChengjiu(human,localData,unionWarData,memberData,1) or isDotChengjiu(human,localData,unionWarData,memberData,2) then
  420. msgRet.cjDot = 1
  421. end
  422. if unionWarData and isDotByBox(human, unionWarData) then
  423. msgRet.zgDot = 1
  424. end
  425. if unionWarData and isDotByShop(human, unionWarData) then
  426. msgRet.shopDot = 1
  427. end
  428. if unionWarData and isDotByCnt(human, unionWarData) then
  429. msgRet.fightDot = 1
  430. end
  431. if unionWarData and isDotByPiPei(human, unionWarData) then
  432. msgRet.pipeiDot = 1
  433. end
  434. if actState == STATE4 and unionState == UNION_STATE1 then
  435. msgRet.winState = unionWarData.isWin and unionWarData.isWin or 0
  436. end
  437. Msg.send(msgRet,human.fd)
  438. end
  439. --请求:查询状态
  440. --返回:状态,攻守双方成员
  441. local function fontUnionWarTeam(net,data)
  442. local localData = UnionWarDBLogic.getLocalData()
  443. local unionWarData = getLocalUnionWarData(localData,data.unionUuid)
  444. local rankData = unionWarData.rank
  445. local temp = {}
  446. for i = 1,3 do
  447. if rankData[i] then
  448. temp[rankData[i][1]] = i
  449. else
  450. break
  451. end
  452. end
  453. net.unionUuid = data.unionUuid
  454. net.name = data.name
  455. net.svrName = data.svrName or ""
  456. net.bannerID = data.bannerID
  457. net.star = data.star
  458. local len = 0
  459. for k,v in pairs(data.member) do
  460. len = len + 1
  461. net.list[len].index = v.index
  462. net.list[len].uuid = v.uuid
  463. net.list[len].name = v.name
  464. net.list[len].star = v.star
  465. net.list[len].zhandouli = v.zhandouli
  466. net.list[len].rank = temp[v.uuid] or 0
  467. local pos = RobotExcel[v.index].pos
  468. net.list[len].x = pos[1]
  469. net.list[len].y = pos[2]
  470. end
  471. net.list[0] = len
  472. end
  473. local function fontSimpleRank(net,unionUuid)
  474. local localData = UnionWarDBLogic.getLocalData()
  475. local unionWarData = getLocalUnionWarData(localData,unionUuid)
  476. local memberList = unionWarData.member
  477. local len = 0
  478. local fields = {name = 1}
  479. local db
  480. for k,v in ipairs(unionWarData.rank) do
  481. len = len + 1
  482. net[len].rank = k
  483. db = RoleDBLogic.getDb(v[1], fields)
  484. net[len].name = db and db.name or memberList[v[1]].name
  485. if len >= 3 then
  486. break
  487. end
  488. end
  489. net[0] = len
  490. end
  491. function onLogin(human)
  492. end
  493. function query(human,msg, actState)
  494. local msgRet = Msg.gc.GC_UNION_WAR_QUERY
  495. local localData = UnionWarDBLogic.getLocalData()
  496. local unionWarData = getLocalUnionWarData(localData,human.db.unionUuid)
  497. fontUnionWarTeam(msgRet.attacker,msg.attacker)
  498. fontUnionWarTeam(msgRet.defender,msg.defender)
  499. fontSimpleRank(msgRet.threeRank,msg.attacker.unionUuid)
  500. local now = os.time()
  501. local d = os.date("*t",now)
  502. d.hour = HOUR3[2]
  503. --[[
  504. if actState == STATE2 then
  505. d.hour = HOUR2[2]
  506. else
  507. d.hour = HOUR3[2]
  508. end
  509. ]]
  510. d.min = 0
  511. d.sec = 0
  512. local checkTime = os.time(d)
  513. msgRet.leftTime = checkTime - now
  514. msgRet.cnt = msg.cnt
  515. msgRet.maxCnt = DefineConf.cnt
  516. -- Msg.trace(msgRet)
  517. Msg.send(msgRet,human.fd)
  518. end
  519. function CGQuery(human)
  520. end
  521. function WLQuery(human,msg)
  522. local actState = getState()
  523. sendState(human,actState,msg.state)
  524. if msg.state == UNION_STATE1 then
  525. query(human,msg, actState)
  526. end
  527. end
  528. -- 客户端 最多请求三次
  529. -- 用于给 客户端 给予 停留在公会战界面 倒计时结束 公会战结果 查询更新
  530. function CGEndQuery(human)
  531. local msgRet = Msg.gc.GC_UNION_WAR_END_STATE_QUERY
  532. local localData = UnionWarDBLogic.getLocalData()
  533. local unionWarData = getLocalUnionWarData(localData,human.db.unionUuid)
  534. msgRet.winState = unionWarData.isWin and unionWarData.isWin or 0
  535. Msg.send(msgRet,human.fd)
  536. end
  537. local function fontBufferNet(msgRet, lv)
  538. msgRet.maxBuff = #UnionWarExcel.buff
  539. local config = UnionWarExcel.buff[lv]
  540. msgRet.nowAttr[0] = 0
  541. msgRet.nextAttr[0] = 0
  542. if config then
  543. for k, v in ipairs(config.attr) do
  544. local net = msgRet.nowAttr[k]
  545. net.key = v[1]
  546. net.value = v[2]
  547. end
  548. msgRet.nowAttr[0] = #config.attr
  549. end
  550. if lv + 1 <= msgRet.maxBuff then
  551. local nextConfig = UnionWarExcel.buff[lv + 1]
  552. for k, v in ipairs(nextConfig.attr) do
  553. local net = msgRet.nextAttr[k]
  554. net.key = v[1]
  555. net.value = v[2]
  556. end
  557. msgRet.nextAttr[0] = #nextConfig.attr
  558. end
  559. end
  560. -- BUF 请求
  561. function CGBuffQuery(human)
  562. local msgRet = Msg.gc.GC_UNION_WAR_BUFF
  563. msgRet.buffLv = 0
  564. fontBufferNet(msgRet, 0)
  565. if human then
  566. Msg.send(msgRet,human.fd)
  567. end
  568. local actState = getState()
  569. if actState > STATE1 then
  570. local msgRet = InnerMsg.lw.LW_UNION_WAR_BUFF_QUERY
  571. msgRet.uuid = human.db._id
  572. msgRet.unionUuid = human.db.unionUuid
  573. InnerMsg.sendMsg(0, msgRet)
  574. end
  575. end
  576. function WLBuffQuery(human, msg)
  577. local msgRet = Msg.gc.GC_UNION_WAR_BUFF
  578. msgRet.buffLv = msg.buffLv
  579. fontBufferNet(msgRet, msg.buffLv)
  580. if human and human.fd then
  581. Msg.send(msgRet,human.fd)
  582. else
  583. local localData = UnionWarDBLogic.getLocalData()
  584. local unionWarData = getLocalUnionWarData(localData, msg.unionUuid)
  585. if not unionWarData or not unionWarData.member then return end
  586. for uuid,_ in pairs(unionWarData.member) do
  587. local human = ObjHuman.onlineUuid[uuid]
  588. if human and human.fd then
  589. Msg.send(msgRet,human.fd)
  590. end
  591. end
  592. end
  593. end
  594. --请求:公会成员信息
  595. --返回:公会成员信息
  596. function CGInfo(human,unionUuid,targetUuid)
  597. local msgRet = InnerMsg.lw.LW_UNION_WAR_INFO
  598. msgRet.uuid = human.db._id
  599. msgRet.attackUnionUuid = human.db.unionUuid
  600. msgRet.unionUuid = unionUuid
  601. msgRet.targetUuid = targetUuid
  602. InnerMsg.sendMsg(0, msgRet)
  603. end
  604. -- 封装 英雄
  605. local function fontHeroList(net,data)
  606. local len = 0
  607. local monsterOutID = data.monsterOutID
  608. if monsterOutID then
  609. for k,v in ipairs(MonsterOutExcel[monsterOutID].member) do
  610. if v[1] > 0 then
  611. len = len + 1
  612. HeroGrid.makeHeroSimpleByMonsterID(net[len],v[1],{lv = v[2]})
  613. end
  614. end
  615. else
  616. for i = 1,CombatDefine.COMBAT_HERO_CNT do
  617. local obj = data.objList[i]
  618. if obj then
  619. len = len + 1
  620. HeroGrid.makeHeroSimpleByID(net[len],obj.id, obj.bagIndex,{lv = obj.lv,star = obj.star})
  621. end
  622. end
  623. end
  624. net[0] = len
  625. end
  626. function getDiff(robotConf,diff,monsterOutID, isFeixu)
  627. if isFeixu then
  628. diff = 3
  629. return robotConf.rate[diff],0,robotConf.jifen2
  630. else
  631. return robotConf.rate[diff],robotConf.star[diff],robotConf.jifen1[diff]
  632. end
  633. end
  634. -- 玩家信息
  635. function WLInfo(human,msg)
  636. local msgRet = Msg.gc.GC_UNION_WAR_INFO
  637. local target = msg.target
  638. msgRet.cnt = msg.cnt
  639. msgRet.maxCnt = DefineConf.cnt
  640. msgRet.unionUuid = msg.unionUuid
  641. msgRet.uuid = target.uuid
  642. msgRet.index = msg.index
  643. msgRet.star = target.defendStar
  644. msgRet.zhandouli = target.zhandouli
  645. msgRet.defendCnt = target.defendCnt
  646. msgRet.canFight = msg.canFight
  647. msgRet.feixuCnt = target.loseBuff
  648. local len = 0
  649. local monsterOutID = target.monsterOutID
  650. if monsterOutID then
  651. msgRet.isRobot = 1
  652. else
  653. msgRet.isRobot = 0
  654. end
  655. local robotConf = RobotExcel[target.index]
  656. local diffList = robotConf.diff
  657. local isFeixu = target.defendStar <= 0
  658. if isFeixu then
  659. diffList = {3}
  660. end
  661. for k,v in ipairs(diffList) do
  662. len = len + 1
  663. local net = msgRet.diffList[len]
  664. net.diff = v
  665. net.rate,net.star,net.jifen = getDiff(robotConf,k,monsterOutID)
  666. local len1 = 0
  667. for k1,v1 in ipairs(robotConf.item[v]) do
  668. len1 = len1 + 1
  669. Grid.makeItem(net.item[len1], v1[1], v1[2])
  670. end
  671. net.item[0] = len1
  672. end
  673. msgRet.diffList[0] = len
  674. -- Util.printTable(target)
  675. fontHeroList(msgRet.list,target)
  676. Msg.send(msgRet,human.fd)
  677. end
  678. --请求:匹配列表
  679. --返回:匹配列表
  680. function CGMatch(human)
  681. local msgRet = InnerMsg.lw.LW_UNION_WAR_MATCH
  682. msgRet.uuid = human.db._id
  683. msgRet.unionUuid = human.db.unionUuid
  684. InnerMsg.sendMsg(0, msgRet)
  685. end
  686. function WLMatch(human,msg)
  687. local msgRet = Msg.gc.GC_UNION_WAR_MATCH
  688. local len = 0
  689. for k,v in ipairs(msg.list) do
  690. len = len + 1
  691. local net = msgRet.list[len]
  692. net.nameLeft = v[1][1]
  693. net.rankLeft = v[1][3] or 0
  694. net.nameRight = v[2][1]
  695. net.rankRight = v[2][3] or 0
  696. net.svrNameLeft = v[3][3]
  697. net.svrNameRight = v[3][4]
  698. if len >= 60 then
  699. break
  700. end
  701. end
  702. msgRet.list[0] = len
  703. Msg.send(msgRet,human.fd)
  704. if human.db.unionUuid then
  705. local localData = UnionWarDBLogic.getLocalData()
  706. local unionWarData = getLocalUnionWarData(localData,human.db.unionUuid)
  707. if unionWarData then
  708. local memberData = getLocalMemberData(unionWarData,human.db._id)
  709. local humanData = getUnionWarData(human,memberData)
  710. local actState = getState()
  711. if actState >= STATE2 and not Util.isSameDay(humanData.pipeiLook) then
  712. humanData.pipeiLook = os.time()
  713. RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_1006)
  714. end
  715. end
  716. end
  717. end
  718. --请求:日志
  719. --返回:日志
  720. function CGAtkLog(human, type)
  721. local msgRet = InnerMsg.lw.LW_UNION_WAR_ATKLOG
  722. msgRet.uuid = human.db._id
  723. msgRet.type = type
  724. msgRet.unionUuid = human.db.unionUuid
  725. InnerMsg.sendMsg(0, msgRet)
  726. end
  727. function WLAtkLog(human, msg)
  728. local msgRet = Msg.gc.GC_UNION_WAR_ATKLOG
  729. msgRet.type = msg.type
  730. local len = 0
  731. for k,v in ipairs(msg.list) do
  732. len = len + 1
  733. local net = msgRet.list[len]
  734. net.upTime = v[1]
  735. net.ret = v[2] and 1 or 0
  736. net.name = v[3]
  737. net.defName = v[4]
  738. net.star = v[5]
  739. net.jifen = v[6]
  740. net.unionUuid = v[7]
  741. net.atkUnionStar = v[8] or 0
  742. net.buffLv = v[9] and v[9] or 0
  743. end
  744. msgRet.list[0] = len
  745. -- Msg.trace(msgRet)
  746. Msg.send(msgRet,human.fd)
  747. end
  748. --请求 防守日志
  749. --返回 防守日志
  750. function CGDefLog(human,uuid, unionUuid)
  751. local msgRet = InnerMsg.lw.LW_UNION_WAR_DEFLOG
  752. msgRet.uuid = human.db._id
  753. msgRet.unionUuid = human.db.unionUuid
  754. msgRet.defendUuid = uuid
  755. msgRet.defendUnion = unionUuid
  756. InnerMsg.sendMsg(0, msgRet)
  757. end
  758. function WLDefLog(human,msg)
  759. local msgRet = Msg.gc.GC_UNION_WAR_DEFLOG
  760. msgRet.zhandouli = msg.defender.zhandouli
  761. fontHeroList(msgRet.heroList,msg.defender)
  762. local len = 0
  763. for k,v in ipairs(msg.list) do
  764. len = len + 1
  765. local net = msgRet.logList[len]
  766. net.id = 0
  767. net.name = v.name
  768. net.zhandouli = v.zhandouli
  769. net.diff = v.diff
  770. net.result = v.result
  771. net.time = v.upTime
  772. local formationConfig = CombatPosLogic.getFormationConfig(v.formation)
  773. net.formation = formationConfig.name
  774. net.videoIndex = v.videoIndex
  775. fontHeroList(net.list,v.target)
  776. end
  777. msgRet.logList[0] = len
  778. --Msg.trace(msgRet)
  779. Msg.send(msgRet,human.fd)
  780. end
  781. function CGVideo(human, videoIndex)
  782. local msgRet = InnerMsg.lw.LW_UNION_WAR_VIDEO
  783. msgRet.uuid = human.db._id
  784. msgRet.unionUuid = human.db.unionUuid
  785. msgRet.index = videoIndex
  786. InnerMsg.sendMsg(0, msgRet)
  787. end
  788. function WLVideo(human,msg)
  789. CombatLogic.repeatCombat(human, msg.combatInfo)
  790. end
  791. --请求:挑战
  792. --返回:挑战失败原因或者战斗帧
  793. function fight(human,args)
  794. local actState = getState()
  795. if actState ~= STATE3 then
  796. return Broadcast.sendErr(human, Lang.UNION_WAR_FIGHT_ERR_END)
  797. end
  798. local msgRet = InnerMsg.lw.LW_UNION_WAR_FIGHT
  799. msgRet.unionUuid = human.db.unionUuid
  800. msgRet.attackUuid = human.db._id
  801. msgRet.defendUuid = args[1]
  802. msgRet.diff = args[2]
  803. InnerMsg.sendMsg(0, msgRet)
  804. print("================fight", msgRet.diff)
  805. end
  806. function sendfightErr(human, msg)
  807. if msg.state == UnionWarMiddleLogic.FIGHT2 then
  808. Broadcast.sendErr(human, Lang.UNION_WAR_FIGHT_ERR_TILI)
  809. elseif msg.state == UnionWarMiddleLogic.FIGHT3 then
  810. Broadcast.sendErr(human, Lang.UNION_WAR_FIGHT_ERR_ING)
  811. elseif msg.state == UnionWarMiddleLogic.FIGHT4 then
  812. Broadcast.sendErr(human, Lang.UNION_WAR_FIGHT_ERR_BEING)
  813. elseif msg.state == UnionWarMiddleLogic.FIGHT5 then
  814. Broadcast.sendErr(human, Lang.UNION_WAR_FIGHT_ERR_STAR)
  815. elseif msg.state == UnionWarMiddleLogic.FIGHT6 then
  816. Broadcast.sendErr(human, Lang.UNION_WAR_FIGHT_ERR_ZIGE)
  817. end
  818. end
  819. function WLFight(human,msg)
  820. print("================wlfight",msg.state,UnionWarMiddleLogic.FIGHT1)
  821. if msg.state ~= UnionWarMiddleLogic.FIGHT1 then
  822. sendfightErr(human, msg)
  823. return
  824. end
  825. human.unionWar = {}
  826. human.unionWar.target = Util.copyTable(msg.defender)
  827. human.unionWar.diff = msg.diff
  828. human.unionWar.name = msg.name
  829. CombatLogic.combatBegin(human,1001, {}, CombatDefine.COMBAT_TYPE12)
  830. end
  831. function getCombatObjList(human, side)
  832. if side == CombatDefine.ATTACK_SIDE then
  833. return CombatLogic.getHumanObjList(human,CombatDefine.COMBAT_TYPE1)
  834. else
  835. local target = human.unionWar.target
  836. local diff = human.unionWar.diff
  837. local rate = RobotExcel[target.index].rate[diff]
  838. for k,v in pairs(target.objList) do
  839. v.attrs[RoleDefine.ATK] = v.attrs[RoleDefine.ATK] * rate/10000
  840. v.attrs[RoleDefine.DEF] = v.attrs[RoleDefine.DEF] * rate/10000
  841. v.attrs[RoleDefine.HP] = v.attrs[RoleDefine.HP] * rate/10000
  842. end
  843. return target.objList, target.helpList, target.rolebase,target.formation, target.jiban
  844. end
  845. end
  846. --挑战结束回调
  847. function onFightEnd(human,ret, combatType, cbParam, combatInfo)
  848. local msgRet = InnerMsg.lw.LW_UNION_WAR_FIGHT_END
  849. msgRet.upTime = os.time()
  850. msgRet.uuid = human.db._id
  851. msgRet.unionUuid = human.db.unionUuid
  852. msgRet.combatInfo = combatInfo
  853. InnerMsg.sendMsg(0, msgRet)
  854. combatInfo.endStatus = CombatLogic.COMBAT_END_STATUS1
  855. human.unionWar = human.unionWar or {}
  856. human.unionWar.combatInfo = combatInfo
  857. WarOrder.trigger(human,CLAN_ORDER_TYPE)
  858. end
  859. function WLFightEnd(human,msg)
  860. local msgRet = Msg.gc.GC_UNION_WAR_FIGHT_END
  861. msgRet.diff = msg.diff
  862. msgRet.unionStar = msg.unionStar
  863. msgRet.defendStar = msg.defender.defendStar
  864. msgRet.defendUuid = msg.defender.uuid or ""
  865. msgRet.defIndex = msg.defender.index
  866. msgRet.cnt = msg.cnt
  867. local combatInfo = msg.combatInfo
  868. local target = msg.defender
  869. local diff = msg.diff
  870. local isFeixu = msg.isFeixu == 1 and true or false
  871. local robotConf = RobotExcel[target.index]
  872. local rate,star,jifen = getDiff(robotConf, diff,target.monsterOutID, isFeixu)
  873. combatInfo.endParam = rate.."|"..star.."|"..msg.defUnionName
  874. combatInfo.rewardItem = robotConf.item[diff]
  875. local localData = UnionWarDBLogic.getLocalData()
  876. local unionWarData = localData[human.db.unionUuid]
  877. local rankData = unionWarData.rank
  878. local addStar = msg.addStar
  879. local memberData = unionWarData.member[human.db._id]
  880. if combatInfo.isWin then
  881. if memberData then
  882. memberData.cnt = memberData.cnt + 1
  883. local chengjiuData = getUnionWarData(human,memberData)
  884. chengjiuData.cnt = chengjiuData.cnt + 1
  885. end
  886. else
  887. combatInfo.rewardItem = robotConf.item2[diff]
  888. jifen = 1
  889. addStar = 0
  890. end
  891. if memberData then
  892. local humanData = getUnionWarData(human,memberData)
  893. humanData.fightCnt = humanData.fightCnt or 0
  894. humanData.fightCnt = msg.cnt
  895. humanData.fightTime = os.time()
  896. end
  897. -- 玩家增加 公会战积分 星级
  898. for k,v in ipairs(rankData) do
  899. if v[1] == human.db._id then
  900. v[2] = v[2] + jifen
  901. v[3] = v[3] + addStar
  902. break
  903. end
  904. end
  905. table.sort(rankData,function(a,b)
  906. return a[2] > b[2]
  907. end)
  908. UnionWarDBLogic.updateDB()
  909. fontSimpleRank(msgRet.threeRank, human.db.unionUuid)
  910. Msg.send(msgRet,human.fd)
  911. for k,v in ipairs(combatInfo.rewardItem) do
  912. BagLogic.addItem(human, v[1], v[2], "unionWar")
  913. end
  914. CombatLogic.sendCombatFinish(human,combatInfo)
  915. human.unionWar = nil
  916. RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_1006)
  917. end
  918. -- 通知参与公会战的在线玩家场景更新 星级 同步
  919. function WLFightTongzhi(msg)
  920. local msgRet = Msg.gc.GC_UNION_WAR_SCENE_INFO
  921. msgRet.unionUuid = msg.atkUnion
  922. msgRet.unionStar = msg.atkUnionStar
  923. msgRet.defendUuid = msg.defUuid
  924. msgRet.defendStar = msg.defStar
  925. msgRet.defIndex = msg.defIndex
  926. msgRet.targetUnion = msg.defUnion
  927. local ToUuid = msg.unionUuid
  928. fontSimpleRank(msgRet.threeRank, ToUuid)
  929. local localData = UnionWarDBLogic.getLocalData()
  930. local unionWarData = getLocalUnionWarData(localData, ToUuid)
  931. for uuid,_ in pairs(unionWarData.member) do
  932. if uuid ~= msg.atkUuid then
  933. local human = ObjHuman.onlineUuid[uuid]
  934. if human then
  935. Msg.send(msgRet,human.fd)
  936. end
  937. end
  938. end
  939. end
  940. --请求:开箱子
  941. --返回:开箱子
  942. function CGBox(human)
  943. local localData = UnionWarDBLogic.getLocalData()
  944. local unionWarData = getLocalUnionWarData(localData,human.db.unionUuid)
  945. local boxData = unionWarData.box
  946. local msgRet = Msg.gc.GC_UNION_WAR_BOX
  947. msgRet.leftTime = 0
  948. msgRet.isWin = 1
  949. local len = 0
  950. local now = os.time()
  951. if boxData and now < boxData.endTime then
  952. msgRet.leftTime = boxData.endTime - now
  953. msgRet.isWin = unionWarData.isWin
  954. for k,v in ipairs(boxData.list) do
  955. len = len + 1
  956. local net = msgRet.list[len]
  957. if v[3] then
  958. net.isOpen = 1
  959. net.name = unionWarData.member[v[3]].name
  960. Grid.makeItem(net.item[1],v[1],v[2])
  961. net.item[0] = 1
  962. if net.name == "" then
  963. local fake = {}
  964. RoleLogic.getRoleBaseByUuid(v[3], fake)
  965. net.name = fake and fake.name or ""
  966. end
  967. else
  968. net.isOpen = 2
  969. net.name = ""
  970. net.item[0] = 0
  971. end
  972. end
  973. end
  974. msgRet.list[0] = len
  975. -- Msg.trace(msgRet)
  976. Msg.send(msgRet,human.fd)
  977. end
  978. -- 战果宝箱领取
  979. function CGBoxGet(human,ind)
  980. local localData = UnionWarDBLogic.getLocalData()
  981. local unionWarData = getLocalUnionWarData(localData,human.db.unionUuid)
  982. local boxData = unionWarData.box
  983. if not boxData then
  984. return
  985. end
  986. if not unionWarData.member[human.db._id] then
  987. return
  988. end
  989. local now = os.time()
  990. if now > boxData.endTime then
  991. Broadcast.sendErr(human, Lang.UNION_WAR_BOX_TIME_ERR)
  992. return
  993. end
  994. if not unionWarData.member[human.db._id].boxTime then
  995. Broadcast.sendErr(human, Lang.UNION_WAR_BOX_TIME_ERR_2)
  996. return
  997. end
  998. if unionWarData.member[human.db._id].boxTime < boxData.endTime then
  999. Broadcast.sendErr(human, Lang.UNION_WAR_BOX_TIME_ERR_2)
  1000. return
  1001. end
  1002. if not boxData.list[ind] then
  1003. return
  1004. end
  1005. if boxData.list[ind][3] then
  1006. Broadcast.sendErr(human, Lang.UNION_WAR_BOX_NOT_ERR)
  1007. return
  1008. end
  1009. for k,v in ipairs(boxData.list) do
  1010. if v[3] == human.db._id then
  1011. Broadcast.sendErr(human, Lang.UNION_WAR_BOX_GET_ERR)
  1012. return
  1013. end
  1014. end
  1015. boxData.list[ind][3] = human.db._id
  1016. local itemID = boxData.list[ind][1]
  1017. local itemCnt = boxData.list[ind][2]
  1018. BagLogic.cleanMomentItemList()
  1019. BagLogic.updateMomentItem(BagLogic.ADDITEM_TYPE_1, itemID, itemCnt)
  1020. BagLogic.addMomentItemList(human, "unionWar")
  1021. local msgRet = Msg.gc.GC_UNION_WAR_BOX_GET
  1022. msgRet.ind = ind
  1023. local net = msgRet.box
  1024. net.isOpen = 1
  1025. net.name = unionWarData.member[human.db._id].name
  1026. Grid.makeItem(net.item[1],itemID, itemCnt)
  1027. net.item[0] = 1
  1028. Msg.send(msgRet,human.fd)
  1029. RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_1006)
  1030. updateRed(human)
  1031. end
  1032. -- 公会战结束
  1033. function actFinish(msg)
  1034. local localData = UnionWarDBLogic.getLocalData()
  1035. local now = os.time()
  1036. local d = os.date("*t",now)
  1037. d.hour = HOUR4[1]
  1038. d.min = 0
  1039. d.sec = 0
  1040. local endTime = os.time(d) + 24 * 3600
  1041. local boxItem
  1042. local perExp = DefineConf.perExp
  1043. local randMax
  1044. for k,v in ipairs(msg.list) do
  1045. if v[4] == Config.SVR_INDEX then
  1046. local unionWarData = localData[v[1]]
  1047. if unionWarData then
  1048. if v[3] == 1 then
  1049. boxItem = DefineConf.boxItem
  1050. else
  1051. boxItem = DefineConf.boxItem2
  1052. end
  1053. randMax = #boxItem
  1054. unionWarData.isWin = v[3]
  1055. unionWarData.star = v[2]
  1056. Util.initTable(unionWarData.box)
  1057. unionWarData.box = {endTime = endTime,list = {}}
  1058. for i = 1,unionWarData.memberCnt do
  1059. local r = math.random(1,randMax)
  1060. unionWarData.box.list[i] = {boxItem[r][1],boxItem[r][2]}
  1061. end
  1062. if v[3] == 1 then
  1063. unionWarData.exp = unionWarData.exp + unionWarData.memberCnt * perExp
  1064. unionWarData.cnt = unionWarData.cnt + 1
  1065. unionWarData.lv = LvExcel[#LvExcel].lv
  1066. for k,v in ipairs(LvExcel) do
  1067. if unionWarData.exp < v.exp then
  1068. unionWarData.lv = v.lv - 1
  1069. break
  1070. end
  1071. end
  1072. end
  1073. end
  1074. end
  1075. end
  1076. UnionWarDBLogic.updateDB()
  1077. local localData = UnionWarDBLogic.getLocalData()
  1078. local title = MailExcel[MailDefine.MAIL_ID_UNION_WAR].title
  1079. local content = MailExcel[MailDefine.MAIL_ID_UNION_WAR].content
  1080. local senderName = MailExcel[MailDefine.MAIL_ID_UNION_WAR].senderName
  1081. for unionUuid,unionWarData in pairs(localData) do
  1082. for k,v in ipairs(unionWarData.rank) do
  1083. if v[2] == 0 then
  1084. break
  1085. end
  1086. local rankID = getUnionWarRankRewardID(k)
  1087. local conf = RankExcel[rankID]
  1088. if not conf then
  1089. break
  1090. end
  1091. MailManager.add(MailManager.SYSTEM, v[1], title, Util.format(content, k, v[2]) , conf.item, senderName)
  1092. end
  1093. end
  1094. end
  1095. --0 不可领取 1 可以领取 2 已经领取
  1096. CHENGJIU_STATE0 = 0
  1097. CHENGJIU_STATE1 = 1
  1098. CHENGJIU_STATE2 = 2
  1099. function CGChengjiu(human,type)
  1100. local ChengjiuExcel = getChengjiuExcel(type)
  1101. local localData = UnionWarDBLogic.getLocalData()
  1102. local unionWarData = getLocalUnionWarData(localData,human.db.unionUuid)
  1103. local memberData = getLocalMemberData(unionWarData,human.db._id)
  1104. local humanData = getUnionWarData(human,memberData)
  1105. local getList,cnt
  1106. if type == 1 then
  1107. cnt = humanData.cnt
  1108. getList = humanData.chengjiu[1]
  1109. else
  1110. cnt = unionWarData.cnt
  1111. getList = humanData.chengjiu[2]
  1112. end
  1113. local msgRet = Msg.gc.GC_UNION_WAR_CHENGJIU
  1114. msgRet.type = type
  1115. local len = 0
  1116. for k, v in ipairs(ChengjiuExcel) do
  1117. len = len + 1
  1118. local net = msgRet.list[len]
  1119. net.id = k
  1120. net.title = v.title or ""
  1121. net.maxCnt = v.cnt
  1122. net.cnt = cnt
  1123. if getList[k] then
  1124. net.state = CHENGJIU_STATE2
  1125. elseif v.cnt <= cnt then
  1126. net.state = CHENGJIU_STATE1
  1127. else
  1128. net.state = CHENGJIU_STATE0
  1129. end
  1130. local len1 = 0
  1131. for k1,v1 in ipairs(v.item) do
  1132. len1 = len1 + 1
  1133. Grid.makeItem(net.item[len1],v1[1],v1[2])
  1134. end
  1135. net.item[0] = len1
  1136. end
  1137. msgRet.list[0] = len
  1138. Msg.send(msgRet,human.fd)
  1139. end
  1140. function chegnjiuFinishGm(human, type)
  1141. local ChengjiuExcel = getChengjiuExcel(type)
  1142. local localData = UnionWarDBLogic.getLocalData()
  1143. local unionWarData = localData[human.db.unionUuid]
  1144. local memberData = getLocalMemberData(unionWarData,human.db._id)
  1145. if not memberData then
  1146. --未参与公会战
  1147. return
  1148. end
  1149. local humanData = getUnionWarData(human,memberData)
  1150. if type == 1 then
  1151. humanData.cnt = humanData.cnt or 0
  1152. humanData.cnt = humanData.cnt + 10
  1153. else
  1154. unionWarData.cnt = unionWarData.cnt + 10
  1155. end
  1156. UnionWarDBLogic.updateDB()
  1157. end
  1158. function CGChengjiuGet(human,type,id)
  1159. local ChengjiuExcel = getChengjiuExcel(type)
  1160. local localData = UnionWarDBLogic.getLocalData()
  1161. local unionWarData = getLocalUnionWarData(localData,human.db.unionUuid)
  1162. local memberData = getLocalMemberData(unionWarData,human.db._id)
  1163. if not memberData then
  1164. --未参与公会战
  1165. return
  1166. end
  1167. local humanData = getUnionWarData(human,memberData)
  1168. local getList,cnt
  1169. if type == 1 then
  1170. cnt = humanData.cnt
  1171. getList = humanData.chengjiu[1]
  1172. else
  1173. cnt = unionWarData.cnt
  1174. getList = humanData.chengjiu[2]
  1175. end
  1176. if getList[id] then
  1177. --已经领取
  1178. return
  1179. end
  1180. local conf = ChengjiuExcel[id]
  1181. if cnt < conf.cnt then
  1182. --未达成成就
  1183. return
  1184. end
  1185. getList[id] = 1
  1186. -- Util.printTable(conf.item)
  1187. BagLogic.addItemList(human, conf.item, "unionWar")
  1188. local msgRet = Msg.gc.GC_UNION_WAR_CHENGJIU_GET
  1189. msgRet.type = type
  1190. msgRet.id = id
  1191. Msg.send(msgRet,human.fd)
  1192. RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_1006)
  1193. updateRed(human)
  1194. end
  1195. local function getShopExcel(type)
  1196. if type == 1 then
  1197. return UnionWarExcel.shop1
  1198. else
  1199. return UnionWarExcel.shop2
  1200. end
  1201. end
  1202. function upWarShopLv(human, lv)
  1203. local localData = UnionWarDBLogic.getLocalData()
  1204. local unionWarData = getLocalUnionWarData(localData,human.db.unionUuid)
  1205. if not unionWarData then return end
  1206. unionWarData.lv = lv
  1207. end
  1208. function CGShop(human,type)
  1209. local ShopExcel = getShopExcel(type)
  1210. local localData = UnionWarDBLogic.getLocalData()
  1211. local unionWarData = getLocalUnionWarData(localData,human.db.unionUuid)
  1212. local memberData = getLocalMemberData(unionWarData,human.db._id)
  1213. local humanData = getUnionWarData(human,memberData)
  1214. local buyList
  1215. if type == 1 then
  1216. buyList = humanData.shop[1]
  1217. else
  1218. buyList = humanData.shop[2]
  1219. end
  1220. local msgRet = Msg.gc.GC_UNION_WAR_SHOP_QUERY
  1221. msgRet.type = type
  1222. local lv = unionWarData.lv
  1223. msgRet.shopLv = lv
  1224. msgRet.exp = unionWarData.exp
  1225. local nextShopConf = LvExcel[unionWarData.lv + 1]
  1226. msgRet.maxExp = nextShopConf and nextShopConf.exp or 0
  1227. local len = 0
  1228. for k,v in pairs(ShopExcel) do
  1229. if v.lv <= lv + 1 then
  1230. len = len + 1
  1231. local net = msgRet.list[len]
  1232. net.id = k
  1233. net.cnt = buyList[k] or 0
  1234. net.maxCnt = v.limit
  1235. net.needLv = v.lv
  1236. Grid.makeItem(net.item,v.item[1],v.item[2])
  1237. net.cost = v.cost
  1238. net.discount = v.discount
  1239. end
  1240. end
  1241. msgRet.list[0] = len
  1242. Msg.send(msgRet,human.fd)
  1243. end
  1244. function CGBuy(human,type,id,buyCnt)
  1245. local ShopExcel = getShopExcel(type)
  1246. local localData = UnionWarDBLogic.getLocalData()
  1247. local unionWarData = getLocalUnionWarData(localData,human.db.unionUuid)
  1248. local memberData = getLocalMemberData(unionWarData,human.db._id)
  1249. local humanData = getUnionWarData(human,memberData)
  1250. local buyList
  1251. if type == 1 then
  1252. buyList = humanData.shop[1]
  1253. else
  1254. buyList = humanData.shop[2]
  1255. end
  1256. local conf = ShopExcel[id]
  1257. if conf.lv > unionWarData.lv then
  1258. --等级不够
  1259. return
  1260. end
  1261. buyCnt = buyCnt or 1
  1262. local cnt = buyList[id] or 0
  1263. if conf.limit > 0 and cnt + buyCnt > conf.limit then
  1264. --达到限购次数
  1265. return
  1266. end
  1267. if not ObjHuman.checkRMB(human, conf.cost * buyCnt) then
  1268. return
  1269. end
  1270. cnt = cnt + buyCnt
  1271. buyList[id] = cnt
  1272. ObjHuman.decZuanshi(human, -conf.cost * buyCnt, "unionWar")
  1273. BagLogic.cleanMomentItemList()
  1274. BagLogic.updateMomentItem(BagLogic.ADDITEM_TYPE_1, conf.item[1],conf.item[2] * buyCnt)
  1275. BagLogic.addMomentItemList(human, "unionWar")
  1276. local msgRet = Msg.gc.GC_UNION_WAR_SHOP_BUY
  1277. msgRet.type = type
  1278. msgRet.id = id
  1279. msgRet.cnt = cnt
  1280. Msg.send(msgRet,human.fd)
  1281. RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_1006)
  1282. updateRed(human)
  1283. end
  1284. function CGRank(human)
  1285. local localData = UnionWarDBLogic.getLocalData()
  1286. local unionWarData = getLocalUnionWarData(localData,human.db.unionUuid)
  1287. local memberList = unionWarData.member
  1288. local msgRet = Msg.gc.GC_UNION_WAR_RANK
  1289. local len = 0
  1290. for k,v in ipairs(unionWarData.rank) do
  1291. len = len + 1
  1292. local net = msgRet.list[len]
  1293. net.uuid = v[1]
  1294. net.rank = k
  1295. local member = memberList[v[1]]
  1296. RoleLogic.makeRoleBase(member.rolebase,net.roleBase)
  1297. net.job = member.post
  1298. local rankID = getUnionWarRankRewardID(k)
  1299. local len1 = 0
  1300. for k1,v1 in ipairs(RankExcel[rankID].item) do
  1301. len1 = len1 + 1
  1302. Grid.makeItem(net.items[len1],v1[1],v1[2])
  1303. end
  1304. net.items[0] = len1
  1305. net.jifen = v[2]
  1306. net.star = v[3]
  1307. end
  1308. msgRet.list[0] = len
  1309. Msg.send(msgRet,human.fd)
  1310. end
  1311. function auto(str)
  1312. print(" auto 1111")
  1313. local Gm = require("chat.Gm")
  1314. local CreateRole = require("role.CreateRole")
  1315. local memberCnt = 30
  1316. local now = os.time()
  1317. local union = UnionDBLogic.getUnionByName(str)
  1318. local teamUuidStr = ""
  1319. local teamHide = {[0] = memberCnt}
  1320. for i = 1, memberCnt do
  1321. local account = str .. string.format("%02d", i)
  1322. local db = RoleDBLogic.getDbByAccount(account)
  1323. if not db then
  1324. db = CreateRole.creatFakeDb(account)
  1325. db.lastLoginTime = os.time()
  1326. db.lastLogoutTime = os.time()
  1327. end
  1328. local human = {}
  1329. human.db = db
  1330. -- ObjHuman.exPand(human)
  1331. Gm.d3.god(human)
  1332. if not union then
  1333. union = UnionDBLogic.addUnion(human, str, 1, "")
  1334. end
  1335. if not union then return end
  1336. if not db.unionUuid then
  1337. db.unionUuid = union._id
  1338. UnionDBLogic.addUnionMember(union, human.db._id)
  1339. end
  1340. CombatPosLogic.setCombatByUnionWarGm(human, CombatDefine.COMBAT_TYPE3)
  1341. union.member[human.db._id].lastDonateTime = now
  1342. ObjHuman.save(human)
  1343. end
  1344. union.lv = UNION_LV
  1345. UnionDBLogic.updateUnionData(union)
  1346. end
  1347. local UNION_RANKREWARD_STATE = nil
  1348. function CGRankReward(human)
  1349. local msgRet = Msg.gc.GC_UNION_WAR_RANK_REWARD
  1350. if not UNION_RANKREWARD_STATE then
  1351. for k, v in ipairs(RankExcel) do
  1352. local net = msgRet.list[k]
  1353. net.id = k
  1354. net.minRank = v.minRank
  1355. net.maxRank = v.maxRank
  1356. for j, h in ipairs(v.item) do
  1357. Grid.makeItem(net.items[j], h[1], h[2])
  1358. end
  1359. net.items[0] = #v.item
  1360. end
  1361. msgRet.list[0] = #RankExcel
  1362. end
  1363. Msg.send(msgRet, human.fd)
  1364. end
  1365. function isDotByBox(human, unionWarData)
  1366. local now = os.time()
  1367. if not unionWarData then
  1368. local localData = UnionWarDBLogic.getLocalData()
  1369. unionWarData = getLocalUnionWarData(localData,human.db.unionUuid)
  1370. end
  1371. if not unionWarData then return end
  1372. local boxData = unionWarData.box
  1373. if not unionWarData.member[human.db._id] then
  1374. return
  1375. end
  1376. if not boxData or not boxData.endTime then return end
  1377. if now > boxData.endTime then
  1378. return
  1379. end
  1380. -- 检测 有没有领过
  1381. for k,v in ipairs(boxData.list) do
  1382. if v[3] == human.db._id then
  1383. return
  1384. end
  1385. end
  1386. return true
  1387. end
  1388. function isDotByShop(human, unionWarData)
  1389. local memberData = getLocalMemberData(unionWarData,human.db._id)
  1390. local humanData = getUnionWarData(human,memberData)
  1391. local buyList
  1392. for type = 1 , 2 do
  1393. if type == 1 then
  1394. buyList = humanData.shop[1]
  1395. else
  1396. buyList = humanData.shop[2]
  1397. end
  1398. local lv = unionWarData.lv
  1399. local len = 0
  1400. local ShopExcel = getShopExcel(type)
  1401. for k,v in pairs(ShopExcel) do
  1402. if v.lv <= lv and not buyList[k] then
  1403. return true
  1404. end
  1405. end
  1406. end
  1407. end
  1408. function isDotByCnt(human, unionWarData)
  1409. local actState = getState()
  1410. if actState == STATE3 and unionWarData.isMatch and Util.isSameDay(unionWarData.matchTime) then
  1411. local memberData = getLocalMemberData(unionWarData,human.db._id)
  1412. local humanData = getUnionWarData(human,memberData)
  1413. if not humanData.fightCnt then
  1414. return true
  1415. end
  1416. if Util.isSameDay(humanData.fightTime) then
  1417. if humanData.fightCnt and humanData.fightCnt < UnionWarExcel.define[1].cnt then
  1418. return true
  1419. end
  1420. else
  1421. return true
  1422. end
  1423. end
  1424. end
  1425. function isDotByPiPei(human, unionWarData)
  1426. local memberData = getLocalMemberData(unionWarData,human.db._id)
  1427. local humanData = getUnionWarData(human,memberData)
  1428. local actState = getState()
  1429. if actState >= STATE2 and actState < STATE4 and unionWarData.isMatch then
  1430. if not Util.isSameDay(humanData.pipeiLook) then
  1431. return true
  1432. end
  1433. end
  1434. end
  1435. function isDot(human)
  1436. if not human.db.unionUuid then
  1437. return
  1438. end
  1439. local localData = UnionWarDBLogic.getLocalData()
  1440. local unionWarData = getLocalUnionWarData(localData,human.db.unionUuid)
  1441. if not unionWarData then return end
  1442. -- 成就
  1443. local memberData = getLocalMemberData(unionWarData,human.db._id)
  1444. if isDotChengjiu(human,localData,unionWarData,memberData,1) or isDotChengjiu(human,localData,unionWarData,memberData,2) then
  1445. return true
  1446. end
  1447. if isDotByBox(human, unionWarData) then
  1448. return true
  1449. end
  1450. if isDotByShop(human, unionWarData) then
  1451. return true
  1452. end
  1453. if isDotByCnt(human, unionWarData) then
  1454. return true
  1455. end
  1456. if isDotByPiPei(human, unionWarData) then
  1457. return true
  1458. end
  1459. end
  1460. -- 更新界面 红点
  1461. function updateRed(human)
  1462. local msgRet = Msg.gc.GC_UNION_WAR_RED
  1463. msgRet.cjDot = 0
  1464. msgRet.zgDot = 0
  1465. msgRet.shopDot = 0
  1466. msgRet.fightDot = 0
  1467. msgRet.pipeiDot = 0
  1468. local localData = UnionWarDBLogic.getLocalData()
  1469. local unionWarData = getLocalUnionWarData(localData,human.db.unionUuid)
  1470. local memberData = getLocalMemberData(unionWarData,human.db._id)
  1471. if not memberData then
  1472. Msg.send(msgRet,human.fd)
  1473. return
  1474. end
  1475. if unionWarData and memberData and isDotChengjiu(human,localData,unionWarData,memberData,1) or isDotChengjiu(human,localData,unionWarData,memberData,2) then
  1476. msgRet.cjDot = 1
  1477. end
  1478. if unionWarData and isDotByBox(human, unionWarData) then
  1479. msgRet.zgDot = 1
  1480. end
  1481. if unionWarData and isDotByShop(human, unionWarData) then
  1482. msgRet.shopDot = 1
  1483. end
  1484. if unionWarData and isDotByCnt(human, unionWarData) then
  1485. msgRet.fightDot = 1
  1486. end
  1487. if unionWarData and isDotByPiPei(human, unionWarData) then
  1488. msgRet.pipeiDot = 1
  1489. end
  1490. Msg.send(msgRet,human.fd)
  1491. end