game_controller.go 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. package controller
  2. import (
  3. actorRemote "f1-game/internal/actor_remote"
  4. capp "f1-game/internal/cherry_app"
  5. "f1-game/internal/code"
  6. "f1-game/internal/data"
  7. nameActor "f1-game/internal/name/actor"
  8. nameKey "f1-game/internal/name/key"
  9. nameRemote "f1-game/internal/name/remote"
  10. "f1-game/internal/pb"
  11. "f1-game/internal/types"
  12. assetOrigin "f1-game/nodes/game/player/asset/origin"
  13. "fmt"
  14. "net/http"
  15. cstring "github.com/cherry-game/cherry/extend/string"
  16. cfacade "github.com/cherry-game/cherry/facade"
  17. clog "github.com/cherry-game/cherry/logger"
  18. cprofile "github.com/cherry-game/cherry/profile"
  19. cgin "github.com/cherry-game/components/gin"
  20. "github.com/gin-gonic/gin"
  21. )
  22. type gameController struct {
  23. cgin.BaseController
  24. }
  25. func (p *gameController) Init() {
  26. p.GET("/game/online/:gameNodeID", p.online)
  27. p.POST("/game/sendMail/:gameNodeID", p.sendMail)
  28. p.POST("/game/addAssets/:gameNodeID", p.addAssets)
  29. p.POST("/game/timeOffset/:gameNodeID", p.timeOffset)
  30. p.POST("/game/playerInfo/:gameNodeID", p.playerInfo)
  31. p.POST("/game/sendMarquee/:gameNodeID", p.sendMarquee)
  32. p.POST("/game/delMarquee/:gameNodeID", p.delMarquee)
  33. p.POST("/game/setBattleValidation/:gameNodeID", p.setBattleValidation)
  34. // 发送gm执行命令
  35. p.POST("/game/gm/:gameNodeID", p.sendGM)
  36. }
  37. func (p *gameController) online(c *cgin.Context) {
  38. gameNodeID := c.GetString(nameKey.GameNodeID, "")
  39. num, statusCode := actorRemote.GameOps.Online(gameNodeID)
  40. code.JSONResult(c, statusCode, num)
  41. }
  42. func (p *gameController) sendMail(c *cgin.Context) {
  43. var (
  44. gameNodeID = c.GetString(nameKey.GameNodeID, "")
  45. req pb.SendMail
  46. )
  47. if len(gameNodeID) <= 0 {
  48. c.JSON(http.StatusBadRequest, gin.H{"error": "gameNodeID is required"})
  49. return
  50. }
  51. if err := c.ShouldBind(&req); err != nil {
  52. c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
  53. return
  54. }
  55. if req.TemplateID <= 0 {
  56. c.JSON(http.StatusBadRequest, gin.H{"error:": "templateID is required"})
  57. return
  58. }
  59. statusCode := actorRemote.GameMail.Send(gameNodeID, &req)
  60. code.JSONResult(c, statusCode)
  61. }
  62. // addAssets 发送道具
  63. func (p *gameController) addAssets(c *cgin.Context) {
  64. var req pb.AddAssets
  65. if err := c.ShouldBind(&req); err != nil {
  66. c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
  67. return
  68. }
  69. var assets types.Assets
  70. for _, asset := range req.Assets {
  71. assets.Add(asset.Id, asset.Num)
  72. }
  73. gameNodeID := c.GetString(nameKey.GameNodeID, "")
  74. _, errCode := actorRemote.GamePlayer.AssetAdd(gameNodeID, req.PlayerID, assets, assetOrigin.GM)
  75. code.JSONResult(c, errCode)
  76. }
  77. func (p *gameController) timeOffset(c *cgin.Context) {
  78. var req pb.I64I64
  79. if err := c.ShouldBind(&req); err != nil {
  80. c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
  81. return
  82. }
  83. gameNodeID := c.GetString(nameKey.GameNodeID, "")
  84. errCode := actorRemote.GamePlayer.Call(gameNodeID, req.Key, nameRemote.Player_GMTimeOffset, &pb.I64{Value: req.Value})
  85. code.JSONResult(c, errCode)
  86. }
  87. func (p *gameController) playerInfo(c *cgin.Context) {
  88. var req pb.I64
  89. if err := c.ShouldBind(&req); err != nil {
  90. c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
  91. return
  92. }
  93. playerID := req.Value
  94. if playerID < 1 {
  95. c.JSON(http.StatusBadRequest, gin.H{"error:": "playerID is required"})
  96. return
  97. }
  98. gameNodeID := c.GetString(nameKey.GameNodeID, "")
  99. errCode, info := actorRemote.GamePlayer.GetPlayerInfo(gameNodeID, playerID)
  100. if code.IsFail(errCode) {
  101. code.JSONError(c, fmt.Sprintf("player data fail. errCode:%d", errCode))
  102. return
  103. }
  104. // 获取邮件信息
  105. errCode, resp := actorRemote.GameMail.GetMailList(gameNodeID, playerID)
  106. if code.IsFail(errCode) {
  107. clog.Warnf("get player info mail fail, errCode:%d", errCode)
  108. } else {
  109. info.Mails = resp.List
  110. }
  111. code.JSONResult(c, code.OK, info)
  112. }
  113. // 设置战斗验证开关
  114. func (p *gameController) setBattleValidation(c *cgin.Context) {
  115. if !cprofile.Debug() {
  116. c.JSON(http.StatusBadRequest, gin.H{"error:": "function not open"})
  117. return
  118. }
  119. var req pb.Bool
  120. if err := c.ShouldBind(&req); err != nil {
  121. c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
  122. return
  123. }
  124. gameNodeID := c.GetString(nameKey.GameNodeID, "")
  125. errCode := actorRemote.GameOps.SetBattleValidation(gameNodeID, &req)
  126. code.JSONResult(c, errCode)
  127. }
  128. func (p *gameController) sendGM(c *cgin.Context) {
  129. if !cprofile.Debug() || !data.NodeState.GmEnable {
  130. c.JSON(http.StatusBadRequest, gin.H{"error:": "function not open"})
  131. return
  132. }
  133. var req pb.StrStr
  134. if err := c.ShouldBind(&req); err != nil {
  135. c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
  136. return
  137. }
  138. // TODO 如果需要后台或者客户端都能调用,是否需要添加密钥验证
  139. playerID := cstring.ToInt64D(req.Key)
  140. gameNodeID := c.GetString(nameKey.GameNodeID, "")
  141. errCode := actorRemote.GamePlayer.SendGM(gameNodeID, playerID, req.Value)
  142. code.JSONResult(c, errCode)
  143. }
  144. func (p *gameController) sendMarquee(c *cgin.Context) {
  145. var (
  146. gameNodeID = c.GetString(nameKey.GameNodeID, "")
  147. req pb.Marquee
  148. )
  149. if len(gameNodeID) <= 0 {
  150. c.JSON(http.StatusBadRequest, gin.H{"error": "gameNodeID is required"})
  151. return
  152. }
  153. if err := c.ShouldBind(&req); err != nil {
  154. c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
  155. return
  156. }
  157. if req.UID <= 0 {
  158. c.JSON(http.StatusBadRequest, gin.H{"error:": "UID is required"})
  159. return
  160. }
  161. targetPath := cfacade.NewPath(gameNodeID, nameActor.Marquee)
  162. statusCode := capp.Call(targetPath, nameRemote.Marquee_Send, &req)
  163. code.JSONResult(c, statusCode)
  164. }
  165. func (p *gameController) delMarquee(c *cgin.Context) {
  166. var (
  167. gameNodeID = c.GetString(nameKey.GameNodeID, "")
  168. req pb.I32List
  169. )
  170. if len(gameNodeID) <= 0 {
  171. c.JSON(http.StatusBadRequest, gin.H{"error": "gameNodeID is required"})
  172. return
  173. }
  174. if err := c.ShouldBind(&req); err != nil {
  175. c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
  176. return
  177. }
  178. if len(req.List) < 1 {
  179. c.JSON(http.StatusBadRequest, gin.H{"error:": "list empty"})
  180. return
  181. }
  182. targetPath := cfacade.NewPath(gameNodeID, nameActor.Marquee)
  183. statusCode := capp.Call(targetPath, nameRemote.Marquee_Del, &req)
  184. code.JSONResult(c, statusCode)
  185. }