gameframe_privateroom.go 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. package frame
  2. import (
  3. "bet24.com/log"
  4. "bet24.com/servers/insecureframe/gate"
  5. "bet24.com/servers/insecureframe/message"
  6. privateroom "bet24.com/servers/micros/privateroom/proto"
  7. robot_query "bet24.com/servers/micros/userservices/proto"
  8. userservices "bet24.com/servers/micros/userservices/proto"
  9. "encoding/json"
  10. "time"
  11. )
  12. // IPrivateRoomSink
  13. func (f *GameFrame) CreatePrivateRoom(creator int, ruleName string, target int, userCount int, playTimeout int) int {
  14. // 先创建一个table
  15. table := f.createPrivateTable(creator, ruleName, target, userCount, playTimeout)
  16. // 去coreservice判断是否能创建
  17. roomNo, errMsg := privateroom.CreatePrivateRoomByGameServer(creator,
  18. f.gameSink.GetGameID(),
  19. f.gameSink.GetGameName(),
  20. f.gameSink.GetServerAddr(),
  21. table.GetTableID())
  22. log.Release("GameFrame.createPrivateRoom %d roomNo:%d,errMsg:%s", creator, roomNo, errMsg)
  23. // 如果失败
  24. if roomNo <= 0 {
  25. // 解散桌子
  26. f.removeTable(table.GetTableID())
  27. return roomNo
  28. }
  29. table.setRoomNo(roomNo)
  30. return roomNo
  31. }
  32. func (f *GameFrame) getPrivateTable(roomNo int) *ThreadsafeTable {
  33. if roomNo <= 0 {
  34. return nil
  35. }
  36. f.lock_table.RLock()
  37. defer f.lock_table.RUnlock()
  38. for k, v := range f.tables {
  39. if v.roomNo != roomNo {
  40. continue
  41. }
  42. if v.stopped {
  43. log.Release("GameFrame.getPrivateTable [%d] stopped", v.tableId)
  44. return nil
  45. }
  46. return f.tables[k]
  47. }
  48. return nil
  49. }
  50. func (f *GameFrame) OnRoomStatusChanged(roomNo int, oldStatus, newStatus int) {
  51. // 找到房间
  52. t := f.getPrivateTable(roomNo)
  53. if t == nil {
  54. log.Release("GameFrame.OnRoomStatusChanged failed roomNo[%d] not exist", roomNo)
  55. return
  56. }
  57. t.onPrivateRoomStatusChanged(oldStatus, newStatus)
  58. }
  59. func (f *GameFrame) OnRoomDismissed(roomNo int) {
  60. // 找到房间
  61. t := f.getPrivateTable(roomNo)
  62. if t == nil {
  63. log.Release("GameFrame.OnRoomDismissed failed roomNo[%d] not exist", roomNo)
  64. return
  65. }
  66. t.onPrivateRoomDismissed()
  67. // 百人场可能需要等待一段时间后才删除
  68. if gameFrame.gameSink.GetChairCount() < 2 {
  69. time.Sleep(2 * time.Minute)
  70. }
  71. f.removeTable(t.tableId)
  72. }
  73. func (f *GameFrame) recvPrivateRoomRequestDismiss(userIndex int32, msg, data string) bool {
  74. if !f.gameSink.IsPrivateRoom() {
  75. return false
  76. }
  77. usr := gate.GetUserInfo(userIndex)
  78. if usr == nil {
  79. log.Debug("recvPrivateRoomRequestDismiss user not exist,%d,%s", userIndex, msg)
  80. return false
  81. }
  82. table := f.getTable(usr.GetUserTableId())
  83. if table == nil {
  84. log.Debug("recvPrivateRoomRequestDismiss user not in table,%d:%d,%s", userIndex, usr.GetUserId(), msg)
  85. return false
  86. }
  87. return table.onPrivateRoomRequestDismiss(usr, msg, data)
  88. }
  89. func (f *GameFrame) ForceEnterUser(userId int, roomNo int, chairId int) {
  90. // 找到房间
  91. t := f.getPrivateTable(roomNo)
  92. if t == nil {
  93. log.Release("GameFrame.ForceEnterUser failed roomNo[%d] not exist", roomNo)
  94. return
  95. }
  96. // 已经在了?
  97. usr := gate.GetUserByUserId(userId)
  98. if usr != nil {
  99. if usr.GetUserTableId() == t.tableId && usr.GetUserChairId() == chairId {
  100. log.Release("GameFrame.ForceEnterUser UserId[%d] RoomNo[%d] user already sit", userId, roomNo)
  101. return
  102. }
  103. log.Release("GameFrame.ForceEnterUser UserId[%d] RoomNo[%d] [%d.%d] kicking exist user[%d.%d]",
  104. userId, roomNo, t.tableId, chairId, usr.GetUserTableId(), usr.GetUserChairId())
  105. gate.KickUser(usr.GetUserIndex())
  106. }
  107. // 把玩家登录进来
  108. usr = gate.LoginAUser(userId)
  109. if usr == nil {
  110. log.Release("GameFrame.ForceEnterUser LoginAUser failed UserId = %d roomNo = %d", userId, roomNo)
  111. return
  112. }
  113. t.AddTableUser_sync(usr.GetUserIndex(), chairId, false, false)
  114. // 如果加入失败
  115. if usr.GetUserTableId() != t.tableId {
  116. log.Release("GameFrame.ForceEnterUser %d to %d failed", userId, roomNo)
  117. gate.SilentRemoveUser(userId)
  118. return
  119. }
  120. if robot_query.IsRobot(userId) {
  121. usr.SetRobot()
  122. }
  123. // 举手
  124. t.setUserReadyStatus_sync(usr.GetUserIndex(), true)
  125. f.addOfflineUser(usr)
  126. gate.SilentRemoveUser(userId)
  127. }
  128. func (f *GameFrame) recvPrivateRoomDismissResp(userIndex int32, msg, data string) bool {
  129. if !f.gameSink.IsPrivateRoom() {
  130. return false
  131. }
  132. usr := gate.GetUserInfo(userIndex)
  133. if usr == nil {
  134. log.Debug("recvPrivateRoomDismissResp user not exist,%d,%s", userIndex, msg)
  135. return false
  136. }
  137. table := f.getTable(usr.GetUserTableId())
  138. if table == nil {
  139. log.Debug("recvPrivateRoomDismissResp user not in table,%d:%d,%s", userIndex, usr.GetUserId(), msg)
  140. return false
  141. }
  142. return table.onPrivateRoomDismissResp(usr, msg, data)
  143. }
  144. func (f *GameFrame) SetExtraParam(roomNo int, userId int, paramId int, data string) (ret string) {
  145. t := f.getPrivateTable(roomNo)
  146. if t == nil {
  147. log.Release("GameFrame.SetExtraParam(%d) failed roomNo[%d] not exist", paramId, roomNo)
  148. return
  149. }
  150. ret = ""
  151. return
  152. }
  153. func (f *GameFrame) recvPrivateRoomKick(userIndex int32, msg, data string) bool {
  154. if !f.gameSink.IsPrivateRoom() {
  155. log.Debug("recvPrivateRoomKick not in privateroom")
  156. return false
  157. }
  158. usr := gate.GetUserInfo(userIndex)
  159. if usr == nil {
  160. log.Debug("recvPrivateRoomKick user not exist,%d,%s", userIndex, msg)
  161. return false
  162. }
  163. table := f.getTable(usr.GetUserTableId())
  164. if table == nil {
  165. log.Debug("recvPrivateRoomKick user not in table,%d:%d,%s", userIndex, usr.GetUserId(), msg)
  166. f.sendKickResult(userIndex, false, "not in table")
  167. return false
  168. }
  169. var kick message.KickUser
  170. e := json.Unmarshal([]byte(data), &kick)
  171. if e != nil {
  172. log.Debug("GameFrame.recvPrivateRoomKick Unmarshal failed %s", data)
  173. f.sendKickResult(userIndex, false, "invalid argument")
  174. return false
  175. }
  176. toUser := gate.GetUserByUserId(kick.ToUserId)
  177. if toUser == nil {
  178. log.Release("GameFrame.recvPrivateRoomKick toUserId[%d] not exist", kick.ToUserId)
  179. return false
  180. }
  181. if !userservices.CanKickPrivateRoomUser(usr.GetUserId(), kick.ToUserId) {
  182. log.Debug("GameFrame.recvPrivateRoomKick [%d]no right to kick[%d]", usr.GetUserId(), kick.ToUserId)
  183. f.sendKickResult(userIndex, false, "no right")
  184. return false
  185. }
  186. // 可以踢人
  187. ret := table.kickUser(toUser.GetUserIndex())
  188. if ret {
  189. // 发送成功指令
  190. f.sendKickResult(userIndex, true, "")
  191. f.sendBeKicked(toUser.GetUserIndex(), usr.GetUserId())
  192. } else {
  193. f.sendKickResult(userIndex, false, "failed")
  194. }
  195. return ret
  196. }
  197. func (f *GameFrame) sendKickResult(userIndex int32, success bool, errMsg string) {
  198. ret := message.KickUser{
  199. Success: success,
  200. ErrMsg: errMsg,
  201. }
  202. d, _ := json.Marshal(ret)
  203. gate.SendMessage(userIndex, message.Frame_PrivateRoom_KickUser, string(d))
  204. }
  205. func (f *GameFrame) sendBeKicked(userIndex int32, fromUserId int) {
  206. ret := message.KickUser{
  207. UserId: fromUserId,
  208. }
  209. d, _ := json.Marshal(ret)
  210. gate.SendMessage(userIndex, message.Frame_PrivateRoom_BeKicked, string(d))
  211. }