LoranSiegeInfo.lua 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362
  1. ---@class LoranSiegeInfo @注释
  2. ---@field TheFirstThreeRankDataList table<number,UserProtos.OtherRoleInfoRes> @三个盟主和副盟主玩家装备数据 key:名次 value:数据
  3. ---@field TheFirstThreeRidList table<number,number> @三个盟主和副盟主玩家rid key:名次 value:rid
  4. ---@field reqOtherPlayerDataIndex number @请求其他玩家装备数据序列(三个盟主和副盟主数据 一个个请求)
  5. ---@field startReqOtherPlayerData boolean @开始请求其他玩家数据
  6. ---@field siegeMainPanelInfo {union:{id:number,name:string,learder:number,deputys:table<number,number>},open:boolean,nextTime:number} @攻城战主面板信息
  7. ---@field siegeStateInfo table<string,number> @攻城战阶段数据 1:repid 2:state 3:nextStateStartTime
  8. ---@field siegeTaskInfo {selfScore:number,nowCount:number,selfRank:number,unionName:string,totalCount:number,unionRank:number,taskId:number,camp:number} @攻城战任务数据
  9. ---@field rolandProgressInfo {now:number,max:number,unionId:number,unionName:string} @攻城战占领进度数据
  10. ---@field monsterList {id:number,cfg:number,x:number,y:string} @攻城战怪物数据
  11. LoranSiegeInfo = class()
  12. local this = LoranSiegeInfo
  13. function this:ctor()
  14. end
  15. function this:Init()
  16. self:Reset()
  17. self:InitData()
  18. self:RegistMessages()
  19. end
  20. function this:InitData()
  21. end
  22. function this:RegistMessages()
  23. SL:RegisterLuaNetMsg(LuaMessageIdToClient.RES_ROLAND_SEIGE_MAIN_PANEL,self.RES_ROLAND_SEIGE_MAIN_PANEL,self)
  24. SL:RegisterLuaNetMsg(LuaMessageIdToClient.RES_ROLAND_SEIGE_STATE,self.RES_ROLAND_SEIGE_STATE,self)
  25. SL:RegisterLuaNetMsg(LuaMessageIdToClient.RES_ROLAND_SEIGE_TASK_PANEL,self.RES_ROLAND_SEIGE_TASK_PANEL,self)
  26. SL:RegisterLuaNetMsg(LuaMessageIdToClient.RES_ROLAND_PROGRESS_INFO,self.RES_ROLAND_PROGRESS_INFO,self)
  27. SL:RegisterLuaNetMsg(LuaMessageIdToClient.RES_ROLAND_MONSTER_LIST,self.RES_ROLAND_MONSTER_LIST,self)
  28. SL:RegisterLuaNetMsg(MessageDef.ResOtherRoleInfoMessage, self.ResOtherRoleInfoMessage, self)
  29. SL:RegisterLUAEvent(LUA_EVENT_PKMODE_CHANGE, self.LUA_EVENT_PKMODE_CHANGE, self)
  30. SL:RegisterLUAEvent(LUA_EVENT_CREATE_PLAYER_SUCCESS, self.LUA_EVENT_CREATE_PLAYER_SUCCESS,self)
  31. SL:RegisterLUAEvent(LUA_EVENT_ROLE_SETTING_PK_MODE_CHANGE, self.LUA_EVENT_ROLE_SETTING_PK_MODE_CHANGE,self)
  32. SL:RegisterTrigger(LUA_TRIGGER_CLICK_ROLE, self.LUA_TRIGGER_CLICK_ROLE,self)
  33. end
  34. ---是否在地图中
  35. function this:IsMap()
  36. local map_id = SL:GetMetaValue(EMetaVarGetKey.MAP_ID)
  37. if map_id == 16001 or map_id == 16002 then
  38. return true
  39. end
  40. return false
  41. end
  42. function this:LUA_TRIGGER_CLICK_ROLE(rid)
  43. if SL:MeData_Check() and self:IsMap() then
  44. local role = SL:GetRoleById(rid)
  45. if role then
  46. local pkValue = role.data.pkMode
  47. local unionID = role.data.unionId
  48. local myPkValue = SL:GetMetaValue(EMetaVarGetKey.PKMODE)
  49. local myUnionID = SL:MeData_GetUnionId()
  50. if myPkValue == EPKMode.Attack or myPkValue == EPKMode.Defend or pkValue == EPKMode.Defend or pkValue == EPKMode.Attack then
  51. if myPkValue == EPKMode.Attack and pkValue == EPKMode.Attack then
  52. return true
  53. end
  54. if myPkValue == EPKMode.Defend and pkValue == EPKMode.Defend then
  55. return true
  56. end
  57. if myPkValue == EPKMode.Union then
  58. return true
  59. end
  60. return false
  61. end
  62. if myPkValue == EPKMode.Union and pkValue == EPKMode.Union then
  63. if unionID == myUnionID then
  64. return true
  65. end
  66. end
  67. end
  68. end
  69. return false
  70. end
  71. function this:LUA_EVENT_CREATE_PLAYER_SUCCESS(id,rid)
  72. if rid and self:IsMap() then
  73. local role = SL:GetRoleById(rid)
  74. local roleList =
  75. {
  76. ERoleType.Me,
  77. ERoleType.Player,
  78. }
  79. if role and table.contains(roleList,role.RoleType) then
  80. InfoManager.loranSiegeInfo:SetRoleHeadIcon(role.data.id,role.data.pkMode,role.data.position)
  81. end
  82. end
  83. end
  84. function this:LUA_EVENT_ROLE_SETTING_PK_MODE_CHANGE(_, pkMode)
  85. if SL:MeData_Check() and self:IsMap() then
  86. SL:SetMetaValue(EMetaVarSetKey.SET_ISNOTCHANGEPKMODE,false)
  87. SL:SetMetaValue(EMetaVarSetKey.SET_PKMODE,pkMode)
  88. if self.isInCopy then
  89. SL:SetMetaValue(EMetaVarSetKey.SET_ISNOTCHANGEPKMODE,true)
  90. end
  91. end
  92. end
  93. function this:LUA_EVENT_PKMODE_CHANGE(_, pkMode)
  94. if SL:MeData_Check() and self:IsMap() then
  95. InfoManager.loranSiegeInfo:SetRoleHeadIcon(SL:MeData_GetId(),pkMode,SL:MeData_GetRoleExtInfo().roleInfoExtData.position)
  96. end
  97. end
  98. ---其他玩家数据
  99. function this:ResOtherRoleInfoMessage(id,message)
  100. if message.type == 1 and self.startReqOtherPlayerData then
  101. self.TheFirstThreeRankDataList[self.reqOtherPlayerDataIndex] = message
  102. self.reqOtherPlayerDataIndex = self.reqOtherPlayerDataIndex + 1
  103. ---是否还有下一个玩家数据需要请求
  104. self:StartReqOtherPlayerData(true)
  105. end
  106. end
  107. ---罗兰攻城战主面板
  108. ---@param message {union:{id:number,name:string,learder:number,deputys:table<number,number>},open:boolean,nextTime:number}
  109. function this:RES_ROLAND_SEIGE_MAIN_PANEL(id,message)
  110. self.TheFirstThreeRankDataList = {}
  111. self.TheFirstThreeRidList = {}
  112. self.reqOtherPlayerDataIndex = 1
  113. self.siegeMainPanelInfo = message
  114. if message then
  115. if message.union and message.union.leader then
  116. self.TheFirstThreeRidList[1] = message.union.leader
  117. for i = 1, table.count(message.union.deputys) do
  118. self.TheFirstThreeRidList[i + 1] = message.union.deputys[i]
  119. end
  120. self:StartReqOtherPlayerData()
  121. end
  122. SL:onLUAEvent(LUA_EVENT_ROLAND_SIEGE_MAIN_PANEL_CHANGE)
  123. end
  124. end
  125. ---响应罗兰攻城战副本阶段
  126. function this:RES_ROLAND_SEIGE_STATE(id,message)
  127. self.siegeStateInfo = nil
  128. if message then
  129. self.siegeStateInfo = message
  130. SL:onLUAEvent(LUA_EVENT_ROLAND_SIEGE_STATE_INFO_CHANGE)
  131. end
  132. end
  133. ---响应罗兰攻城战任务面板信息
  134. function this:RES_ROLAND_SEIGE_TASK_PANEL(id,message)
  135. if message then
  136. self.siegeTaskInfo = message
  137. SL:SetMetaValue(EMetaVarSetKey.SET_ISNOTCHANGEPKMODE,true)
  138. SL:onLUAEvent(LUA_EVENT_ROLAND_SIEGE_TASK_INFO_CHANGE)
  139. end
  140. end
  141. ---响应罗兰攻城战占领进度
  142. function this:RES_ROLAND_PROGRESS_INFO(id,message)
  143. self.rolandProgressInfo = nil
  144. if not message then
  145. return
  146. end
  147. self.rolandProgressInfo = message
  148. SL:onLUAEvent(LUA_EVENT_ROLAND_SIEGE_ROLAND_PROGRESS_INFO_CHANGE)
  149. end
  150. ---响应罗兰攻城战地图怪物信息
  151. function this:RES_ROLAND_MONSTER_LIST(id,message)
  152. self.monsterList = {}
  153. if not message then
  154. return
  155. end
  156. self.monsterList = message
  157. SL:onLUAEvent(LUA_EVENT_ROLAND_SIEGE_ROLAND_MONSTER_LIST_CHANGE)
  158. end
  159. ---设置玩家头上标识
  160. ---@param id number @玩家id
  161. ---@param pkValue number @战斗模式
  162. ---@param position number @职位
  163. function this:SetRoleHeadIcon(id,pkValue,position)
  164. if self:IsMap() then
  165. local tagStr = ""
  166. if pkValue == EPKMode.Attack then
  167. if position == EUnionPosition.Leader then
  168. tagStr = EHeadIconTag.siege_atkBig
  169. else
  170. tagStr = EHeadIconTag.siege_atk
  171. end
  172. elseif pkValue == EPKMode.Defend then
  173. if position == EUnionPosition.Leader then
  174. tagStr = EHeadIconTag.siege_defBig
  175. else
  176. tagStr = EHeadIconTag.siege_def
  177. end
  178. end
  179. SL:SetMetaValue(EMetaVarSetKey.SET_ROLE_HEAD_ICON,id,tagStr)
  180. end
  181. end
  182. ---开始请求玩家装备数据
  183. function this:StartReqOtherPlayerData(isEvent)
  184. if self.TheFirstThreeRidList[self.reqOtherPlayerDataIndex] then
  185. self.startReqOtherPlayerData = true
  186. ---自己的话不用请求
  187. if self.TheFirstThreeRidList[self.reqOtherPlayerDataIndex] == SL:GetMetaValue(EMetaVarGetKey.UID) then
  188. local equip = {}
  189. local meData = SL:MeData_GetRoleExtInfo()
  190. if meData and meData.roleInfoExtData and meData.roleInfoExtData.equip then
  191. equip = meData.roleInfoExtData.equip
  192. end
  193. self.TheFirstThreeRankDataList[self.reqOtherPlayerDataIndex] =
  194. {
  195. role =
  196. {
  197. name = SL:GetMetaValue(EMetaVarGetKey.USER_NAME),
  198. roleInfoExt = {equip=equip},
  199. career = SL:MeData_GetCareer()
  200. }
  201. }
  202. ---当第一个数据是自己的时候需要isEvent为true,因为第一个数据是自己的时候不会走ResOtherRoleInfoMessage协议,isEvent还是为空
  203. if self.reqOtherPlayerDataIndex == 1 then
  204. isEvent = true
  205. end
  206. self.reqOtherPlayerDataIndex = self.reqOtherPlayerDataIndex + 1
  207. self:StartReqOtherPlayerData(isEvent)
  208. return
  209. end
  210. SL.Friend:ReqOtherRoleInfoMessage(self.TheFirstThreeRidList[self.reqOtherPlayerDataIndex], 1)
  211. else
  212. self.startReqOtherPlayerData = false
  213. if isEvent then
  214. SL:onLUAEvent(LUA_EVENT_REQ_SIEGE_UNION_PLAYER_END)
  215. end
  216. end
  217. end
  218. ---获取盟主副盟主的数据
  219. ---@param index number @名次
  220. function this:GetTheFirstThreeRankData(index)
  221. return self.TheFirstThreeRankDataList[index]
  222. end
  223. ---获取占领战盟名字
  224. function this:GetOccupyUnionName()
  225. if self.siegeMainPanelInfo.union and self.siegeMainPanelInfo.union.name then
  226. return self.siegeMainPanelInfo.union.name
  227. end
  228. return ""
  229. end
  230. ---攻城战是否开启
  231. function this:GetIsOpen()
  232. local activityInfo = InfoManager.activityPreviewInfo:GetActivityInfo(16001)
  233. if not activityInfo then
  234. return false
  235. end
  236. return activityInfo.open
  237. end
  238. ---攻城战下次开启时间
  239. function this:GetNextOpenTime()
  240. return self.siegeMainPanelInfo.nextTime
  241. end
  242. ---@param data UserProtos.RoleInfo
  243. function this:GetPlayerRoleInfo(data)
  244. local role_param = { "body", "head", "armor", "hand", "pants", "boot" }
  245. local wear_list_str = ""
  246. local model_list_str = ""
  247. local equipInfo = data.roleInfoExt.equip
  248. if equipInfo then
  249. local default_tbl = SL:GetConfig("cfg_model_default", data.career.baseCareer)
  250. local model_list = {}
  251. for _, v in pairs(role_param) do
  252. model_list[v] = default_tbl[v]
  253. end
  254. for _, v in ipairs(equipInfo) do
  255. ---@type cfg_item_column
  256. local itemInfo = SL:GetConfig("cfg_item", v.cfgId)
  257. if itemInfo and itemInfo.type == 2 then
  258. if itemInfo.subType == 1 then
  259. if wear_list_str == "" then
  260. wear_list_str = "WeaponRspineParent#" .. itemInfo.field[1]
  261. else
  262. wear_list_str = wear_list_str .. ",WeaponRspineParent#" .. itemInfo.field[1]
  263. end
  264. elseif itemInfo.subType == 2 then
  265. if wear_list_str == "" then
  266. wear_list_str = "WeaponLspineParent#" .. itemInfo.field[1]
  267. else
  268. wear_list_str = wear_list_str .. ",WeaponLspineParent#" .. itemInfo.field[1]
  269. end
  270. elseif itemInfo.subType == 3 then
  271. if wear_list_str == "" then
  272. wear_list_str = "WeaponRspineParent#" .. itemInfo.field[1]
  273. else
  274. wear_list_str = wear_list_str .. ",WeaponRspineParent#" .. itemInfo.field[1]
  275. end
  276. elseif itemInfo.subType == 13 then
  277. if wear_list_str == "" then
  278. wear_list_str = "Wing#" .. itemInfo.field[1]
  279. else
  280. wear_list_str = wear_list_str .. ",Wing#" .. itemInfo.field[1]
  281. end
  282. elseif itemInfo.subType == 30 then
  283. if wear_list_str == "" then
  284. wear_list_str = "BuffspineParent#" .. itemInfo.field[1]
  285. else
  286. wear_list_str = wear_list_str .. ",BuffspineParent#" .. itemInfo.field[1]
  287. end
  288. else
  289. local point = ""
  290. ---@type cfg_model_charactor_column
  291. local model_tbl = SL:GetConfig("cfg_model_charactor", itemInfo.field[1])
  292. if model_tbl then
  293. if model_tbl.part == 23 then
  294. point = "body"
  295. elseif model_tbl.part == 11 then
  296. point = "head"
  297. elseif model_tbl.part == 2 then
  298. point = "armor"
  299. elseif model_tbl.part == 9 then
  300. point = "hand"
  301. elseif model_tbl.part == 15 then
  302. point = "pants"
  303. elseif model_tbl.part == 5 then
  304. point = "boot"
  305. end
  306. if point ~= "" then
  307. model_list[point] = itemInfo.field[1]
  308. end
  309. end
  310. end
  311. end
  312. end
  313. for _, v in pairs(model_list) do
  314. if model_list_str == "" then
  315. model_list_str = v
  316. else
  317. model_list_str = model_list_str .. "#" .. v
  318. end
  319. end
  320. end
  321. return model_list_str, wear_list_str
  322. end
  323. function this:Reset()
  324. self.isInCopy = false
  325. self.monsterList = {}
  326. self.siegeTaskInfo = nil
  327. self.rolandProgressInfo = nil
  328. self.siegeStateInfo = nil
  329. self.siegeMainPanelInfo = {}
  330. self.TheFirstThreeRankDataList = {}
  331. self.TheFirstThreeRidList = {}
  332. self.reqOtherPlayerDataIndex = 1
  333. self.startReqOtherPlayerData = false
  334. end