KLSelectRolePanel.lua 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411
  1. ---@class KLSelectRolePanel:UIKmlLuaPanelBase
  2. ---@field view KLSelectRolePanelView
  3. local KLSelectRolePanel = class(UIKmlLuaPanelBase)
  4. local this = KLSelectRolePanel
  5. function this:AsyncLoadUI()
  6. end
  7. ---创建时调用一次
  8. function this:Init()
  9. self.ItemList = {}
  10. self.RoleTable = {}
  11. self.createCount = 1
  12. local p = GUI:GetAnchoredPosition(self.view.CreatButton)
  13. self.createStartPos = Vector2.New(0, p.y)
  14. self.createEndPos = Vector2.New(0, 420)
  15. end
  16. ---注册UI事件和服务器消息
  17. function this:RegistEvents()
  18. GUI:AddOnClickEvent(self.view.CreatButton, self, self.CreatButtonOnClick)
  19. GUI:AddOnClickEvent(self.view.StartButton, self, self.StartButtonOnClick)
  20. GUI:AddOnClickEvent(self.view.BackButton, self, self.BackButtonOnClick)
  21. SL:RegisterLuaNetMsg(MessageDef.ResCreateRoleMessage, self.ResCreateRoleMessage, self)
  22. SL:RegisterLuaNetMsg(MessageDef.ResRemoveRoleMessage, self.ResRemoveRoleMessage, self)
  23. SL:RegisterLuaNetMsg(MessageDef.ResRandomRoleNameMessage, self.ResRandomRoleNameMessage, self)
  24. end
  25. ---界面显示时调用一次
  26. function this:Show()
  27. self.lastRoleId = PlayerPrefs.GetString(SL.LoginManager:GetLastAccount() .. "ChoosePlayer", "")
  28. self:ShowRole()
  29. SL.LoginManager:SetInGame(false)
  30. SL.LoginManager:SetIsLoginCheck(nil)
  31. if #SL.LoginManager:GetLoginRes_Role() == 0 then
  32. self:ShowChooseRole()
  33. else
  34. self:HideChooseRole()
  35. end
  36. SL:PlayBGM(10018, true)
  37. end
  38. ---创建或者刷新界面数据时调用
  39. function this:Refresh()
  40. end
  41. function this:Close()
  42. if self.Model ~= nil then
  43. PlayerPrefs.SetString(SL.LoginManager:GetLastAccount() .. "ChoosePlayer", self.Model.date.rid)
  44. end
  45. self:CleanRole()
  46. self.Role = nil
  47. for i, v in pairs(self.RoleTable) do
  48. self.registInBaseUI:RemoveModelEffect(v.Model)
  49. end
  50. self.RoleTable = {}
  51. end
  52. function this:KmlBackRefresh()
  53. if #SL.LoginManager:GetLoginRes_Role() == 0 then
  54. self:ShowChooseRole()
  55. else
  56. self:HideChooseRole()
  57. end
  58. end
  59. -- 每帧更新,需要使用时打开
  60. function this:Update()
  61. if SL.Main:GetVersion() == EVersion.XW then
  62. for _, v in pairs(self.ItemList) do
  63. if v.role then
  64. v.role:Update()
  65. end
  66. end
  67. end
  68. end
  69. function this:LoginGameImmediately()
  70. if LoginManager.quickLoginInfo then
  71. SL.UIManager.ShowNotHideUI("UILoadingWaitPanel", { isTips = true, msg = "" })
  72. SL.GamePlay:SetGameInfo(_, _, LoginManager.quickLoginInfo.rid, LoginManager.quickLoginInfo.rName)
  73. SL.NetManager_Req:ReqEnterRoleMessage(LoginManager.quickLoginInfo.rid)
  74. LoginManager.quickLoginInfo = nil
  75. end
  76. end
  77. function this:CreatButtonOnClick(control)
  78. ---先做已创建人物数量判断
  79. if #SL.LoginManager:GetLoginRes_Role() < 4 then
  80. self:ShowChooseRole()
  81. else
  82. SL.UIManager:ShowNotHideUI("UIPromptTipPanel", { textContent = "可创建角色已满" })
  83. end
  84. end
  85. function this:StartButtonOnClick()
  86. if not SL.Main:IsEditor() and (SL.Main:IsAndroid() or SL.Main:IsIos()) then
  87. SL:InitErrorLogTool()
  88. end
  89. if SL.LoginManager:GetLoginRes() and #SL.LoginManager:GetLoginRes_Role() > 0 then
  90. SL.UIManager:ShowNotHideUI("UILoadingWaitPanel", { isTips = true, msg = "" })
  91. SL.GamePlay:SetGameInfo(_, _, self.Model.date.rid, self.Model.date.name)
  92. SL.NetManager_Req:ReqEnterRoleMessage(self.Model.date.rid)
  93. else
  94. SL:TipMessage(SL:GetConfig('cfg_string', 316).text, 1, NoticeType.NoticeMid)
  95. end
  96. end
  97. ---@param message UserProtos.CreateRoleRes
  98. function this:AddPlayer(message)
  99. self:CreateRoleModel(message.role)
  100. self.haveRoleCount = self.haveRoleCount + 1
  101. end
  102. ---开始游戏
  103. function this:StartGame()
  104. SL.NetManager_Req:ReqEnterRoleMessage(self.Model.date.rid)
  105. end
  106. --显示当前选中的角色
  107. ---@param UIModelItemTemplate UIModelItemTemplate
  108. function this:ShowChoosePlayer(UIModelItemTemplate)
  109. if self.Model == nil then
  110. self.Model = UIModelItemTemplate
  111. GUI:SetActive(self.Model.view.DeleteBtn, true)
  112. self.Model:LoadEffect()
  113. else
  114. GUI:SetActive(self.Model.view.DeleteBtn, false)
  115. self.Model:RecycleEffect()
  116. self.Model = UIModelItemTemplate
  117. GUI:SetActive(self.Model.view.DeleteBtn, true)
  118. self.Model:LoadEffect()
  119. end
  120. end
  121. function this:DeleteRole(id)
  122. self.deleteID = id
  123. for _, v in pairs(SL.LoginManager:GetLoginRes_Role()) do
  124. if v.rid == id then
  125. if v.roleInfoExt.totalrecharge > 0 then
  126. SL:CommonTipsMessage({ showTips = "尊贵的玩家,您的角色已经进行了较大金额的充值,为保护您的权益,如需删除角色请联系客服" })
  127. return
  128. end
  129. end
  130. end
  131. SL:CommonTipsMessage({ showTips = "确定要删除该角色吗", ui = self, callback = self.ReqDelete })
  132. end
  133. function this.ReqDelete(message)
  134. SL.NetManager_Req:ReqRemoveRoleMessage(message.ui.deleteID)
  135. if not SL.Main:IsLocalServer() or SL.Main:IsEditor() then
  136. this:DeleteServerRoleInfo(message.ui.deleteID)
  137. end
  138. end
  139. function this:DeleteServerRoleInfo(rid)
  140. local tbl = {
  141. openId = SL.LoginManager:GetOpenId(),
  142. rid = tostring(rid)
  143. }
  144. local loginForm = SL:GetWWWForm(tbl)
  145. local loginUrl = SL.UIStaticParameter:GetDeleteServerUrl()
  146. SL:logNoFlag(loginUrl)
  147. SL.Http:RequestWWW(loginUrl, loginForm, self.UpdateRoleBack, self)
  148. end
  149. function this:UpdateRoleBack(www)
  150. local msg = SL:DecodeJson(www)
  151. if msg ~= nil and msg.success ~= nil then
  152. SL:Log("RoleInfo report server success")
  153. else
  154. SL:Log("RoleInfo report server fail")
  155. end
  156. end
  157. function this:ShowRole()
  158. self:CleanRole()
  159. self.haveRoleCount = 0
  160. for i, v in pairs(SL.LoginManager:GetLoginRes_Role()) do
  161. self:CreateRoleModel(v)
  162. self.haveRoleCount = self.haveRoleCount + 1
  163. end
  164. end
  165. --创建玩家角色模型
  166. ---@param v UserProtos.RoleInfo
  167. function this:CreateRoleModel(v)
  168. local tp = {}
  169. tp.rid = v.rid
  170. table.insert(self.ItemList, tp)
  171. if tp.Model == nil then
  172. GUI:UIPanel_Open("dev/ui/CreateRole/Panel/KLUIModel/KLUIModelItemPanel", self.view.PlayerRole, self, { createRolePanel = self }, true, function(win)
  173. --webgl下GetTemplateByLoad异步加载,self.tp值被覆盖了,需要通过下面的逻辑重新找一下
  174. --local tpk, tp = table.find(self.ItemList, function(_, _, k, itemV)
  175. -- return itemV.rid == v.rid
  176. --end)
  177. --self.tp = tp
  178. tp.Model = win
  179. GUI:SetAsLastSibling(tp.Model.view.root)
  180. tp.Model:RefreshUI(v, self.createCount)
  181. if self.Model == nil then
  182. self.Model = tp.Model
  183. GUI:SetActive(self.Model.view.root, true)
  184. self.Model:LoadEffect()
  185. end
  186. self.Model:ShowDeleteBtn(true)
  187. if tostring(v.rid) == self.lastRoleId then
  188. if self.Model ~= nil then
  189. GUI:SetActive(self.Model.view.DeleteBtn, false)
  190. self.Model:RecycleEffect()
  191. end
  192. self.Model = tp.Model
  193. GUI:SetActive(self.Model.view.DeleteBtn, true)
  194. self.Model:LoadEffect()
  195. self:EnterGameOnExitSceneEditor()
  196. end
  197. if SL.Main:GetVersion() == EVersion.XW then
  198. tp.Model:PlayerAni()
  199. end
  200. self.createCount = self.createCount + 1
  201. end)
  202. end
  203. end
  204. function this:CleanRole()
  205. self.Model = nil
  206. if self.ItemList then
  207. for k, v in pairs(self.ItemList) do
  208. if v.Model then
  209. GUI:UIPanel_Close("", v.Model)
  210. end
  211. end
  212. end
  213. self.ItemList = {}
  214. self.createCount = 1
  215. end
  216. --点击显示职业
  217. function this:ShowJob()
  218. end
  219. function this:KmlCreateButtonOnClick()
  220. GUI:SetActive(self.view.BackButton, false)
  221. GUI:SetActive(self.view.StartButton, false)
  222. local t = GUI:DOAnchorPos(GUI:GetRectTransform(self.view.CreateButton), self.createEndPos, 0)
  223. GUI:TweenSetOnComplete(t, function()
  224. GUI:SetActive(self.view.NewCreateButton, false)
  225. ---(Kml初始化完成)打开Kml创建角色界面
  226. GUI:UIPanel_Open("dev/ui/CreateRole/Panel/KLUICreateRole/KLUICreateRolePanel", nil, nil, { unlockList = Sl.LoginManager:GetLoginRes_UnlockList(), uiCreateRolePanel = self })
  227. end)
  228. end
  229. function this:BackButtonOnClick(control)
  230. if SL.LoginInfo:IsSDK() then
  231. if SL.Main:IsWindows() then
  232. SL:QuitGame()
  233. else
  234. if SL.LoginInfo:IsBox() or SL.LoginInfo:IsBoxSDK() then
  235. ---返回选择服务器页面
  236. GUI:UIPanel_Close("dev/ui/CreateRole/Panel/KLSelectRole/KLSelectRolePanel")
  237. SL.NetManager:Close()
  238. GUI:UIPanel_Open("dev/ui/LoadingPanel/Panel/KLUILoadingPanel/KLUILoadingPanelPanel", nil, nil, { ProgressType = ProgressType.NoProcess, texure2DPath = "muuiback" }, false, not SL:GetIsWebGL())
  239. SL.Scene:SetSceneName("login")
  240. this.request = SceneManager.Load("Scene/login.unity", this.OnLoadlogin)
  241. else
  242. MuInterface.Instance:LogoutAccount()
  243. end
  244. end
  245. else
  246. ---返回选择服务器页面
  247. GUI:UIPanel_Close("dev/ui/CreateRole/Panel/KLSelectRole/KLSelectRolePanel")
  248. SL.NetManager:Close()
  249. GUI:UIPanel_Open("dev/ui/LoadingPanel/Panel/KLUILoadingPanel/KLUILoadingPanelPanel", nil, nil, { ProgressType = ProgressType.NoProcess, texure2DPath = "muuiback" }, false, not SL:GetIsWebGL())
  250. SL.Scene:SetSceneName("login")
  251. this.request = SL.SceneManager:Load("Scene/login.unity", this.OnLoadlogin)
  252. end
  253. end
  254. function this.OnLoadlogin()
  255. SL.MainCamera:ResetCameraToMain()
  256. GUI:UIPanel_Close("dev/ui/LoadingPanel/Panel/KLUILoadingPanel/KLUILoadingPanelPanel")
  257. local env = SL:GetMetaValue("CS_MAIN_ENV")
  258. if SL.LoginInfo:IsSDK() or (not string.isNullOrEmpty(env) and env ~= "local") or (SL.Main:IsEditor() and UtilityLua.ConvertEnumToInt(ResourceManager.mode) == 2) then
  259. GUI:UIPanel_Open("dev/ui/Login/Panel/KLSelectGameLogin/KLSelectGameLoginPanel")
  260. else
  261. SL.UIManager:ShowFunctionUI("UILoginPanel", { panelState = PanelStateEnum.ConnectServer, isBackFromCreateRole = true })
  262. end
  263. SL:onLUAEvent(LUA_EVENT_PLAYER_LOGOUT)
  264. end
  265. ---接收 KmlCreateRoleUI 界面事件,调整原lua界面部分组件显隐
  266. ---message[2] = "false" Kml界面开启,message[2] = "true" Kml界面关闭
  267. function this:HideChooseRolePanel(id, message)
  268. if message then
  269. if message[2] == "true" then
  270. self:HideChooseRole()
  271. end
  272. self:SetPlayerRoleModelShowState(message[2] == "true")
  273. end
  274. end
  275. ---isShow = false 创建角色时隐藏现有角色模型
  276. function this:SetPlayerRoleModelShowState(isShow)
  277. GUI:SetActive(self.view.BackButton, isShow)
  278. if not isShow then
  279. for _, v in pairs(self.ItemList) do
  280. GUI:SetActive(v.Model.view.root, false)
  281. v.Model.role.gameObject:SetActive(false)
  282. end
  283. else
  284. for _, v in pairs(self.ItemList) do
  285. if v.Model then
  286. v.Model.role.gameObject:SetActive(true)
  287. GUI:SetActive(v.Model.view.root, true)
  288. v.Model.role:SetAnyActionStopTime(1)
  289. v.Model.role:SetActionForce()
  290. v.Model.role.transform.position = v.Model.modelPos
  291. v.Model.role.model.transform.localPosition = Vector3.New(0, 0, 0)
  292. end
  293. end
  294. end
  295. end
  296. function this:ShowChooseRole()
  297. GUI:SetActive(self.view.BackButton, false)
  298. GUI:SetActive(self.view.StartButton, false)
  299. local t = GUI:DOAnchorPos(GUI:GetRectTransform(self.view.CreatButton), self.createEndPos, 0.5)
  300. GUI:TweenSetOnComplete(t, function()
  301. GUI:SetActive(self.view.NewCreateButton, false)
  302. GUI:UIPanel_Open("dev/ui/CreateRole/Panel/KLUICreateRole/KLUICreateRolePanel", nil, nil, { unlockList = SL.LoginManager:GetLoginRes_UnlockList(), uiCreateRolePanel = self })
  303. end)
  304. end
  305. function this:HideChooseRole()
  306. local t = GUI:DOAnchorPos(GUI:GetRectTransform(self.view.CreatButton), self.createStartPos, 0.5)
  307. GUI:TweenSetOnComplete(t, function()
  308. if self.view then
  309. GUI:SetActive(self.view.StartButton, true)
  310. GUI:SetActive(self.view.BackButton, true)
  311. end
  312. end)
  313. end
  314. ---@param message UserProtos.RemoveRoleRes
  315. function this:ResRemoveRoleMessage(id, message)
  316. SL.LoginManager:RemoveRole(message)
  317. self:ShowRole()
  318. SL:onLUAEvent(LUA_EVENT_DELETEROLE, message.role)
  319. end
  320. ---@param message UserProtos.RandomRoleNameRes
  321. function this:ResRandomRoleNameMessage(id, message)
  322. self.randomName = message.roleName
  323. end
  324. ---@param message UserProtos.CreateRoleRes
  325. function this:ResCreateRoleMessage(id, message)
  326. SL.SDKMgr:SubmitGameData(ESubmitDataType.CreateRole, nil, message.role.rid, message.role.name, message.role.level)
  327. SL.NetManager:PrintMessage(id, message)
  328. SL.LoginManager:AddRoleRes(message)
  329. if self.Model ~= nil then
  330. GUI:SetActive(self.Model.view.DeleteBtn, false)
  331. self.Model:RecycleEffect()
  332. self.Model = nil
  333. end
  334. self:HideChooseRole()
  335. self:AddPlayer(message)
  336. self:HideChooseRolePanel(_, { [2] = "true" })
  337. if not SL.Main:IsLocalServer() or SL.Main:IsEditor() then
  338. self:UpdateHttpUserInfo(SL.LoginManager:GetOpenId(), message.role.rid, message.role.name, message.role.career.baseCareer)
  339. end
  340. ---创角成功关闭kml创角界面
  341. GUI:UIPanel_Close('dev/ui/CreateRole/Panel/KLUICreateRole/KLUICreateRolePanel')
  342. SL:onLUAEvent(LUA_EVENT_CREATEROLE, message.role)
  343. end
  344. function this:UpdateHttpUserInfo(openId, rid, rName, rBaseCareer)
  345. local tbl = {
  346. openId = openId,
  347. rid = tostring(rid),
  348. rName = rName,
  349. rBaseCareer = rBaseCareer,
  350. sid = SL.LoginManager:GetCurServer_Sid(),
  351. createTime = os.time(),
  352. channelId = SL.LoginManager:GetChannelId()
  353. }
  354. local loginForm = SL:GetWWWForm(tbl)
  355. local loginUrl = SL.UIStaticParameter:GetCreateServerUrl()
  356. SL:logNoFlag(loginUrl)
  357. SL.Http:RequestWWW(loginUrl, loginForm, self.UpdateRoleBack, self)
  358. end
  359. function this:EnterGameOnExitSceneEditor()
  360. if SL:GetIsXtra() then
  361. if SL:IsSceneEditorOperTypeClose() then
  362. self:StartButtonOnClick()
  363. end
  364. end
  365. end
  366. return this