Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

367 wiersze
12 KiB

  1. local MJDefine = MJFramework.MJImport("mj.luaScript.MJDefine")
  2. local MJMessage = MJFramework.MJImport("mj.luaScript.Protocol.MJMessage")
  3. local MJSound = MJFramework.MJImport("mj.luaScript.MJSound")
  4. local Mahjong3DHandCard = MJFramework.MJFrameworkClassImprot("mj.luaScript.Common.3d.Mahjong3DHandCard")
  5. local HandCard3D = class("HandCard3D", Mahjong3DHandCard)
  6. function HandCard3D:ctor(...)
  7. HandCard3D.super.ctor(self, ...)
  8. end
  9. --- HandCard3D:onAfterCreateHandcards 创建手牌之后的处理
  10. function HandCard3D:onAfterCreateHandcards()
  11. HandCard3D.super.onAfterCreateHandcards(self)
  12. end
  13. function HandCard3D:onAfterCreateOpenHandcards()
  14. HandCard3D.super.onAfterCreateOpenHandcards(self)
  15. end
  16. function HandCard3D:createGroupCards(arg, fromViewId)
  17. for _, v in pairs(arg) do
  18. if not fromViewId then
  19. fromViewId = v.fromViewId
  20. end
  21. local group = nil
  22. if v.opType == MJDefine.MJOperateType.OPREATE_ANGANG then
  23. group = self:getGroup(v.values[1], {MJDefine.MJOperateType.OPREATE_ANGANG})
  24. if group then
  25. group:setCardNum(v.cardNum)
  26. group:customRefresh(v)
  27. return
  28. end
  29. end
  30. local startPos = MJDefine.MJConfig_3d.HandCardStartPos[self._viewId]
  31. group = self:createGroup(v.values, v.showType, self._viewId, table.nums(self._groupNodes) + 1, v.cardNum)
  32. if group then
  33. local x = startPos.x + MJDefine.MJConfig_3d.GroupOffsetConfig[self._viewId][#self._groupNodes + 1].x
  34. local y = startPos.y + MJDefine.MJConfig_3d.GroupOffsetConfig[self._viewId][#self._groupNodes + 1].y
  35. group.fromViewId = v.fromViewId ---保留触发操作的玩家位置,补杠需要
  36. group.opType = v.opType
  37. group:setPosition(cc.p(x, y))
  38. group:customRefresh(v)
  39. self:addChild(group)
  40. table.insert(self._groupNodes, group)
  41. end
  42. end
  43. self:refreshGroupZOrder()
  44. end
  45. function HandCard3D:createGroup(values, showType, viewId, groupIndex, cardNum)
  46. local group = nil
  47. if showType == 1 then
  48. group = require(MJDefine.MJConfig_3d.GROUP_CHI):new(values, viewId, groupIndex)
  49. elseif showType == 2 then
  50. group = require(MJDefine.MJConfig_3d.GROUP_PENG):new(values, viewId, groupIndex)
  51. elseif showType == 3 then
  52. group = require(MJDefine.MJConfig_3d.GROUP_GANG):new(values, viewId, groupIndex, cardNum)
  53. elseif showType == 4 then
  54. group = require(MJDefine.MJConfig_3d.GROUP_ANGANG):new(values, viewId, groupIndex, cardNum)
  55. elseif showType == 5 then
  56. group = require(MJDefine.MJConfig_3d.GROUP_BAGANG):new(values, viewId, groupIndex, cardNum)
  57. elseif showType == MJDefine.MJGroupType.Fei then
  58. group = require(MJDefine.MJConfig_3d.GROUP_FEI):new(values, viewId, groupIndex)
  59. elseif showType == MJDefine.MJGroupType.Ti then
  60. group = require(MJDefine.MJConfig_3d.GROUP_TI):new(values, viewId, groupIndex)
  61. end
  62. if group and viewId == 1 then
  63. group:setLocalZOrder(4 - groupIndex)
  64. end
  65. return group
  66. end
  67. ---
  68. -- 补杠
  69. -- @param card 补杠的牌
  70. -- @param cardNum 多头杠牌张数
  71. -- @return
  72. --
  73. function HandCard3D:buGang(card, cardNum)
  74. local oldGroup = self:getGroup(card, {MJDefine.MJOperateType.OPREATE_BAGANG, MJDefine.MJOperateType.OPREATE_ZHIGANG, MJDefine.MJOperateType.OPREATE_ANGANG})
  75. if oldGroup then
  76. -- 如果没有碰牌,则查看是否已经有补杠
  77. local cards = oldGroup:getCards()
  78. if cards and cards[4] then
  79. oldGroup:setCardNum(cardNum)
  80. cards[4]:setOperateBackImage()
  81. end
  82. return
  83. else
  84. oldGroup = self:getGroup(card, {MJDefine.MJOperateType.OPREATE_PENG})
  85. if not oldGroup then
  86. oldGroup = self:getGroup(card, {MJDefine.MJOperateType.OPREATE_TI})
  87. end
  88. end
  89. if not oldGroup then
  90. return
  91. end
  92. local fromViewId = oldGroup.fromViewId
  93. -- 杠牌对家,换成第四张
  94. if app.room:getMaxPlayerCount() == 2 and fromViewId ~= 0 then
  95. fromViewId = 4
  96. end
  97. if app.room:getMaxPlayerCount() == 4 and fromViewId == 2 then
  98. fromViewId = 4
  99. end
  100. local index = table.indexOf(self._groupNodes, oldGroup)
  101. table.remove(self._groupNodes, index)
  102. oldGroup:removeFromParent()
  103. local newGroup = self:createGroup({card, card, card, card}, MJDefine.MJGroupType.BaGang, self._viewId, index, cardNum)
  104. if not newGroup then
  105. return
  106. end
  107. newGroup.fromViewId = fromViewId
  108. newGroup.opType = MJDefine.MJOperateType.OPREATE_BAGANG
  109. table.insert(self._groupNodes, index, newGroup)
  110. local startPos = MJDefine.MJConfig_3d.HandCardStartPos[self._viewId]
  111. local x = startPos.x + MJDefine.MJConfig_3d.GroupOffsetConfig[self._viewId][index].x
  112. local y = startPos.y + MJDefine.MJConfig_3d.GroupOffsetConfig[self._viewId][index].y
  113. newGroup:setPosition(cc.p(x, y))
  114. newGroup:customRefresh(newGroup)
  115. self:addChild(newGroup)
  116. self:refreshGroupZOrder()
  117. end
  118. --- HandCard3D:retoreBuGang 还原补杠
  119. -- @param card 牌值
  120. -- @param cardNum 牌张数
  121. function HandCard3D:restoreBuGang(card, cardNum)
  122. local oldGroup =
  123. self:getGroup(
  124. card,
  125. {
  126. MJDefine.MJOperateType.OPREATE_BAGANG,
  127. MJDefine.MJOperateType.OPREATE_ANGANG,
  128. MJDefine.MJOperateType.OPREATE_ZHIGANG
  129. })
  130. if not oldGroup then
  131. return
  132. end
  133. local oldCardNum = oldGroup:getCardNum()
  134. if oldCardNum > 4 then
  135. oldCardNum = oldCardNum - 1
  136. oldGroup:setCardNum(oldCardNum)
  137. oldGroup:customRefresh()
  138. return
  139. end
  140. local fromViewId = oldGroup.fromViewId
  141. -- 杠牌对家,换成第四张
  142. if app.room:getMaxPlayerCount() == 2 and fromViewId ~= 0 then
  143. fromViewId = 4
  144. end
  145. if app.room:getMaxPlayerCount() == 4 and fromViewId == 2 then
  146. fromViewId = 4
  147. end
  148. local index = table.indexOf(self._groupNodes, oldGroup)
  149. table.remove(self._groupNodes, index)
  150. oldGroup:removeFromParent()
  151. local newGroup = self:createGroup({card, card, card}, MJDefine.MJGroupType.Peng, self._viewId, index, cardNum)
  152. if not newGroup then
  153. return
  154. end
  155. newGroup.fromViewId = fromViewId
  156. newGroup.opType = MJDefine.MJOperateType.OPREATE_PENG
  157. table.insert(self._groupNodes, index, newGroup)
  158. local startPos = MJDefine.MJConfig_3d.HandCardStartPos[self._viewId]
  159. local x = startPos.x + MJDefine.MJConfig_3d.GroupOffsetConfig[self._viewId][index].x
  160. local y = startPos.y + MJDefine.MJConfig_3d.GroupOffsetConfig[self._viewId][index].y
  161. newGroup:setPosition(cc.p(x, y))
  162. self:addChild(newGroup)
  163. self:refreshGroupZOrder()
  164. end
  165. -- 提操作(这里是用换牌操作,所以要改变类型; 当然也可以使用移除重新原有位置上添加的操作处理)
  166. function HandCard3D:ti(value, lziCard)
  167. -- 更改操作牌
  168. local group = self:getGroup(value, {MJDefine.MJOperateType.OPREATE_FEI})
  169. local cards = group:getCards()
  170. for i, v in pairs(cards) do
  171. local cardValue = v:getValue()
  172. if cardValue ~= value then
  173. v:setValue(value)
  174. v:setValueImage(value)
  175. v:setIsTingYongCard(false)
  176. end
  177. end
  178. -- 操作类型从提更改为碰
  179. group.opType = MJDefine.MJOperateType.OPREATE_TI
  180. -- 更改手牌
  181. if self:getViewId() == MJDefine.PlayerViewType.My or self._isReplay then
  182. local card = self:getMjByValue(value)
  183. card:setValue(lziCard)
  184. card:setValueImage(lziCard)
  185. card:setIsTingYongCard(true)
  186. -- 提操作后,要把提的牌重置到最后一张。如果是不需要放置最后一张,注释代码即可
  187. self:removeHandCard(lziCard)
  188. self:resetHandCards()
  189. self:createHandCards(lziCard)
  190. local lastCard = self:getLastCard() -- 最后一张就是刚创建的牌了
  191. lastCard:setIsTingYongCard(true)
  192. end
  193. end
  194. -- 检查出牌
  195. -- 添加判断所有玩家是否都定缺完毕
  196. -- 添加不可打出听用牌
  197. -- 添加打出最后一张手牌,也会重置手牌顺序
  198. function HandCard3D:sendOutCard()
  199. local gameRule = app.room.roomInfo:getGameRule()
  200. if getNumBand(gameRule.specialrule, 0x01) > 0 then
  201. if table.nums(app.room.roomInfo:getDingQueInfo()) ~= app.room:getPlayerCount() then
  202. showTooltip('等待其他玩家操作定缺')
  203. return
  204. end
  205. end
  206. if self.touchMJ:getIsTingYongCard() then
  207. if self.touchMJ:getPositionY() > MJDefine.MJ_TOUCH_OUT_CARD_Y then
  208. self.touchMJ:restorePostion()
  209. self.touchMJ:setStatus(MJDefine.MJStatus.Normal)
  210. -- app.room:dispatchEvent({name = MJDefine.MJEvent.SelectCard}) -- 广播
  211. app.room:dispatchEvent({name = MJDefine.MJEvent.ShowTing}) -- 广播
  212. end
  213. showTooltip('不可打出听用牌')
  214. return
  215. end
  216. if not (self.isOutCard and self.touchMJ) then
  217. return
  218. end
  219. local request = MJMessage.Card:new()
  220. request.card = self.touchMJ:getValue()
  221. -- logE("LHQRecordView:setOutCardVisible"..table.tostring(request))
  222. self:sendMsg(
  223. app.room,
  224. MJDefine.MJEvent.OutCard,
  225. request,
  226. function(status, response)
  227. logE("MJHandCardView sendOutCard() response = ", table.tostring(response))
  228. end
  229. )
  230. --音效
  231. local userInfo = app.room:getUserInfoByViewId(self._viewId)
  232. if userInfo then
  233. MJSound.PlayMJSound(userInfo.sex, request.card)
  234. end
  235. self:runOutCardAction(self.touchMJ:getValue())
  236. app.room:dispatchEvent({name = MJDefine.MJEvent.OutCardFalg, value = self.touchMJ:getValue(), viewId = self._viewId})
  237. app.room:dispatchEvent({name = MJDefine.MJEvent.LOCAL_OUT_CARD, card = self.touchMJ:getValue()})
  238. self:setOutCardEnable(false)
  239. --插牌
  240. if self.touchMJ == self._handCardNodes[#self._handCardNodes] then
  241. table.removeItem(self._handCardNodes, self.touchMJ)
  242. self:resetHandCards() -- 打出最后一张手牌,也要刷新手牌
  243. else
  244. table.removeItem(self._handCardNodes, self.touchMJ)
  245. self:runInsertCardAction()
  246. end
  247. self.touchMJ:removeFromParent()
  248. self.touchMJ = nil
  249. app.room:dispatchEvent({name = MJDefine.MJEvent.SelectCard})
  250. app.room:dispatchEvent({name = MJDefine.MJEvent.ShowTing})
  251. self:setTing(false)
  252. app.room:resetTings()
  253. app.room.roomInfo.lastOutViewId = MJDefine.MyViewId
  254. end
  255. -- 判断手牌是否全是听用牌(针对胡操作,如果全是听用则不显示过操作)
  256. function HandCard3D:getIsAllTingYongCard()
  257. local handCardNode = self:getHandCardNodes()
  258. for i, v in pairs(handCardNode) do
  259. if not v:getIsTingYongCard() then
  260. return false
  261. end
  262. end
  263. return true
  264. end
  265. -- 重写排序,让听用牌放在最左边
  266. function HandCard3D:sortHandCards()
  267. -- 拆分
  268. local temp = {}
  269. local tCard = {}
  270. local nCard = {}
  271. local qCard = {}
  272. for i, v in ipairs(self._handCardNodes) do
  273. if v:getIsTingYongCard() then
  274. table.insert(tCard, v)
  275. elseif v:getIsDingQueCard() then
  276. table.insert(qCard, v)
  277. else
  278. table.insert(nCard, v)
  279. end
  280. end
  281. -- 按牌值顺序排序
  282. local function sortFun(c1, c2)
  283. return c1:getValue() < c2:getValue()
  284. end
  285. table.sort(tCard, sortFun)
  286. table.sort(nCard, sortFun)
  287. table.sort(qCard, sortFun)
  288. -- 添加到大表temp里面
  289. for i, v in ipairs(tCard) do
  290. table.insert(temp, v)
  291. end
  292. for i, v in ipairs(nCard) do
  293. table.insert(temp, v)
  294. end
  295. for i, v in ipairs(qCard) do
  296. table.insert(temp, v)
  297. end
  298. self._handCardNodes = temp
  299. end
  300. -- 重写创建手牌,根据viewID,走不同的创建方式
  301. function HandCard3D:createHandCards(cards, isHuCard)
  302. if self._viewId == MJDefine.MyViewId then
  303. HandCard3D.super.createHandCards(self, cards)
  304. else
  305. if isHuCard then
  306. self:createOpenHandCards(cards)
  307. else
  308. HandCard3D.super.createHandCards(self, cards)
  309. end
  310. end
  311. end
  312. function HandCard3D:cleanTouchMJ()
  313. if self.touchMJ then
  314. self.touchMJ = nil
  315. end
  316. end
  317. return HandCard3D