gm.go 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351
  1. package service
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "gadmin/config"
  6. "gadmin/internal/admin/consts"
  7. "gadmin/internal/admin/forms"
  8. "gadmin/internal/admin/gm_rpc/rpc_share"
  9. "gadmin/package/gmdata"
  10. "gadmin/utility/character"
  11. "gadmin/utility/player"
  12. "gadmin/utility/serializer"
  13. "github.com/gin-gonic/gin"
  14. msg2 "leafstalk/covenant/msg"
  15. )
  16. // Gm gm服务
  17. var Gm = new(sGm)
  18. type sGm struct{}
  19. /*// DelRank 删除玩家排行榜
  20. func (s *sGm) DelRank(ctx *gin.Context, req forms.DelRankReq) serializer.Response {
  21. logrus.Warnf("Gm.DelRank req:%+v", req)
  22. var (
  23. err error
  24. name, ok = constants.GmRankNameMap[req.RankType]
  25. userAccountModel sqlModel.UserAccount
  26. )
  27. if req.ServerId <= 0 {
  28. return serializer.Err(consts.CodeParamErr, "请选择一个有效的服务器", nil)
  29. }
  30. if !ok {
  31. return serializer.Err(consts.CodeParamErr, "删除玩家排行失败,提交的排名类型未加入到服务中", err)
  32. }
  33. playerAttr, err := player.GetAttrByUserId(req.UserID)
  34. if err != nil {
  35. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  36. }
  37. DB, err := player.GetDBByPlayerAttr(playerAttr)
  38. if err != nil {
  39. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  40. }
  41. //获取userAccount
  42. err = config.LDB.WithContext(ctx).Scopes(sqlModel.UserAccountTable(&userAccountModel, playerAttr.AccID)).Where("accId = ?", playerAttr.AccID).First(&userAccountModel).Error
  43. if err != nil {
  44. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  45. }
  46. openIdArr := strings.Split(userAccountModel.Openid, "@")
  47. msg := msg2.GmDelRank{
  48. MsgId: fmt.Sprintf("delRank:%v", character.GenerateMsgId()),
  49. PlayerID: req.UserID,
  50. RankType: req.RankType,
  51. ClientPlat: openIdArr[1],
  52. }
  53. //if err = gate.SendToWorld(0, &msg); err != nil {
  54. // return serializer.Err(consts.CodeParamErr, "删除玩家排行失败", err)
  55. //}
  56. rpc_share.MsgMap[msg.MsgId] = fmt.Sprintf("GM删除玩家排行榜排名 PlayerID: %d, RankType: [%v]", req.UserID, name)
  57. var resp *msg2.ResponseGmDelRank
  58. res, err := config.GmNats.GmRequest(DB, "GmDelRank", msg)
  59. if err != nil {
  60. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  61. }
  62. if err = json.Unmarshal(res, &resp); err != nil {
  63. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  64. }
  65. rpc_share.LogChan <- rpc_share.LogMsg{
  66. MsgID: msg.MsgId,
  67. Data: resp,
  68. }
  69. return serializer.Suc(req)
  70. }*/
  71. // UpdateGuides 更新引导
  72. func (s *sGm) UpdateGuides(ctx *gin.Context, req forms.UpdateGuidesReq) serializer.Response {
  73. var (
  74. err error
  75. )
  76. DB, err := player.GetDBByUserId(req.Playerid)
  77. if err != nil {
  78. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  79. }
  80. userGuides := make(map[int64]int)
  81. for _, v := range req.Guides {
  82. userGuides[int64(v)] = 1
  83. }
  84. msg := msg2.GmUpdateGuides{
  85. MsgId: character.GenerateMsgId(),
  86. PlayerID: req.Playerid,
  87. Guides: userGuides,
  88. }
  89. rpc_share.MsgMap[msg.MsgId] = fmt.Sprintf("GM为修改引导 PlayerID: %d, Guides: %v", req.Playerid, req.Guides)
  90. var resp *msg2.ResponseGmUpdateGuides
  91. res, err := config.GmNats.GmRequest(DB, "GmUpdateGuides", msg)
  92. if err != nil {
  93. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  94. }
  95. if err = json.Unmarshal(res, &resp); err != nil {
  96. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  97. }
  98. rpc_share.LogChan <- rpc_share.LogMsg{
  99. MsgID: msg.MsgId,
  100. Data: resp,
  101. }
  102. return serializer.Suc(req)
  103. }
  104. // UpdateChapter 更新关卡
  105. func (s *sGm) UpdateChapter(ctx *gin.Context, req forms.UpdateChapterReq) serializer.Response {
  106. var err error
  107. DB, err := player.GetDBByUserId(req.Playerid)
  108. if err != nil {
  109. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  110. }
  111. msgId := character.GenerateMsgId()
  112. var msg msg2.GmUpdateChapter
  113. if req.OneFull {
  114. msg = msg2.GmUpdateChapter{
  115. MsgId: msgId,
  116. PlayerID: req.Playerid,
  117. Chapters: NewFullChapters(true),
  118. }
  119. rpc_share.MsgMap[msgId] = fmt.Sprintf("GM为玩家[%d]一键通关", req.Playerid)
  120. } else if req.OneEmpty {
  121. msg = msg2.GmUpdateChapter{
  122. MsgId: msgId,
  123. PlayerID: req.Playerid,
  124. Chapters: NewFullChapters(false),
  125. }
  126. rpc_share.MsgMap[msgId] = fmt.Sprintf("GM清除了玩家[%d]的通关数据", req.Playerid)
  127. } else {
  128. msg = msg2.GmUpdateChapter{
  129. MsgId: msgId,
  130. PlayerID: req.Playerid,
  131. Chapters: NewPassChapters(req.PassChapters),
  132. }
  133. if len(msg.Chapters) == 0 {
  134. return serializer.Err(consts.CodeParamErr, "请选择一个有效的关卡", nil)
  135. }
  136. rpc_share.MsgMap[msgId] = fmt.Sprintf("GM为玩家[%d]通关了指定关卡:%v", req.Playerid, req.PassChapters)
  137. }
  138. var resp *msg2.ResponseGmUpdateChapter
  139. res, err := config.GmNats.GmRequest(DB, "GmUpdateChapter", msg)
  140. if err != nil {
  141. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  142. }
  143. if err = json.Unmarshal(res, &resp); err != nil {
  144. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  145. }
  146. rpc_share.LogChan <- rpc_share.LogMsg{
  147. MsgID: msg.MsgId,
  148. Data: resp,
  149. }
  150. return serializer.Suc(req)
  151. }
  152. func NewFullChapters(pass bool) map[int64]int64 {
  153. chapters := make(map[int64]int64, 3)
  154. if pass {
  155. chapters = gmdata.GetMaxChapterForType()
  156. }
  157. return chapters
  158. }
  159. func NewPassChapters(chapterStr []string) map[int64]int64 {
  160. chapters := make(map[int64]int64, 3)
  161. chapterMap := gmdata.GetChaptersMap()
  162. for _, chapter := range chapterStr {
  163. if data, ok := chapterMap[chapter]; ok {
  164. if _, ok1 := chapters[data.Type]; !ok1 || data.Uid > chapters[data.Type] {
  165. chapters[data.Type] = data.Uid
  166. }
  167. }
  168. }
  169. return chapters
  170. }
  171. /*// UpdateTalent 更新天赋
  172. func (s *sGm) UpdateTalent(ctx *gin.Context, req forms.UpdateTalentReq) serializer.Response {
  173. var (
  174. data = msg2.GmUpdateTalent{
  175. MsgId: character.GenerateMsgId(),
  176. PlayerID: req.Playerid,
  177. }
  178. err error
  179. )
  180. data.Talents = req.TalentInfo
  181. //if err = gate.SendToWorld(0, &msg); err == nil {
  182. // rpc_share.MsgMap[msg.MsgId] = fmt.Sprintf("GM为玩家[%d]修改天赋[%v]", req.Playerid, req.TalentInfo)
  183. //}
  184. DB, err := player.GetDBByUserId(req.Playerid)
  185. if err != nil {
  186. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  187. }
  188. rpc_share.MsgMap[data.MsgId] = fmt.Sprintf("GM为玩家[%d]修改天赋[%v]", req.Playerid, req.TalentInfo)
  189. var resp *msg2.ResponseGmUpdateTalent
  190. res, err := config.GmNats.GmRequest(DB, "GmUpdateTalent", data)
  191. if err != nil {
  192. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  193. }
  194. if err = json.Unmarshal(res, &resp); err != nil {
  195. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  196. }
  197. rpc_share.LogChan <- rpc_share.LogMsg{
  198. MsgID: data.MsgId,
  199. Data: resp,
  200. }
  201. return serializer.Suc(req)
  202. }
  203. // UpdatePlayerBase 更新玩家金币、钻石、 经验、体力、精力、天赋点
  204. func (s *sGm) UpdatePlayerBase(ctx *gin.Context, req forms.UpdatePlayerBaseReq) serializer.Response {
  205. playerAttr, err := player.GetAttrByUserId(req.Playerid)
  206. if err != nil {
  207. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  208. }
  209. DB, err := player.GetDBByPlayerAttr(playerAttr)
  210. if err != nil {
  211. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  212. }
  213. //获取userAccount
  214. var userAccountModel sqlModel.UserAccount
  215. err = config.LDB.WithContext(ctx).Scopes(sqlModel.UserAccountTable(&userAccountModel, playerAttr.AccID)).Where("accId = ?", playerAttr.AccID).First(&userAccountModel).Error
  216. if err != nil {
  217. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  218. }
  219. openIdArr := strings.Split(userAccountModel.Openid, "@")
  220. if req.Exp > 0 || req.TalentPoint != 0 {
  221. data := msg2.GmAddExp{
  222. MsgId: character.GenerateMsgId(),
  223. PlayerID: req.Playerid,
  224. Exp: req.Exp,
  225. TalentPoint: req.TalentPoint,
  226. }
  227. //if err = gate.SendToWorld(0, &data); err != nil {
  228. // return serializer.Err(consts.CodeParamErr, "更新玩家经验或天赋点失败", err)
  229. //}
  230. if req.Exp > 0 {
  231. rpc_share.MsgMap[data.MsgId] = fmt.Sprintf("GM为玩家[%d]添加经验[%d]", req.Playerid, req.Exp)
  232. }
  233. if req.TalentPoint > 0 {
  234. rpc_share.MsgMap[data.MsgId] = fmt.Sprintf("GM为玩家[%d]添加天赋[%d]", req.Playerid, req.TalentPoint)
  235. }
  236. var resp *msg2.ResponseGmAddExp
  237. res, err := config.GmNats.GmRequest(DB, "GmAddExp", data)
  238. if err != nil {
  239. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  240. }
  241. if err = json.Unmarshal(res, &resp); err != nil {
  242. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  243. }
  244. rpc_share.LogChan <- rpc_share.LogMsg{
  245. MsgID: data.MsgId,
  246. Data: resp,
  247. }
  248. }
  249. if req.Stamina != 0 || req.Energy != 0 {
  250. data := msg2.GmAddStama{
  251. MsgId: character.GenerateMsgId(),
  252. PlayerID: req.Playerid,
  253. Stama: req.Stamina,
  254. Energy: req.Energy,
  255. ClientPlat: openIdArr[1],
  256. }
  257. //if err = gate.SendToWorld(0, &msg); err != nil {
  258. // return serializer.Err(consts.CodeParamErr, "更新玩家体力或精力失败", err)
  259. //}
  260. rpc_share.MsgMap[data.MsgId] = fmt.Sprintf("GM为玩家[%d]更新体力[%d],精力[%d]", req.Playerid, req.Stamina, req.Energy)
  261. var resp *msg2.ResponseGmAddStama
  262. res, err := config.GmNats.GmRequest(DB, "GmAddStama", data)
  263. if err != nil {
  264. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  265. }
  266. if err = json.Unmarshal(res, &resp); err != nil {
  267. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  268. }
  269. rpc_share.LogChan <- rpc_share.LogMsg{
  270. MsgID: data.MsgId,
  271. Data: resp,
  272. }
  273. }
  274. if req.Diamond != 0 || req.Coin != 0 {
  275. data := msg2.GmAddMaterial{
  276. MsgId: character.GenerateMsgId(),
  277. PlayerID: req.Playerid,
  278. Materials: []*model.DropMaterial{{constants.MaterilaId_Diamond, req.Diamond}, {constants.MaterilaId_Coin, req.Coin}},
  279. ClientPlat: openIdArr[1],
  280. }
  281. //if err = gate.SendToWorld(0, &msg); err != nil {
  282. // return serializer.Err(consts.CodeParamErr, "更新玩家变更钻石或金币失败", err)
  283. //}
  284. rpc_share.MsgMap[data.MsgId] = fmt.Sprintf("GM为玩家[%d]变更钻石[%d],金币[%d] ", req.Playerid, req.Diamond, req.Coin)
  285. var resp *msg2.ResponseGmAddMaterial
  286. res, err := config.GmNats.GmRequest(DB, "GmAddMaterial", data)
  287. if err != nil {
  288. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  289. }
  290. if err = json.Unmarshal(res, &resp); err != nil {
  291. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  292. }
  293. rpc_share.LogChan <- rpc_share.LogMsg{
  294. MsgID: data.MsgId,
  295. Data: resp,
  296. }
  297. }
  298. return serializer.Suc(req)
  299. }*/