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. msg := msg2.GmSetGuide{
  81. MsgId: character.GenerateMsgId(),
  82. PlayerID: req.Playerid,
  83. Guides: req.Guides,
  84. }
  85. //if err = gate.SendToWorld(0, &msg); err != nil {
  86. // return serializer.Err(consts.CodeParamErr, "更新引导失败", err)
  87. //}
  88. rpc_share.MsgMap[msg.MsgId] = fmt.Sprintf("GM为修改引导 PlayerID: %d, Guides: %v", req.Playerid, req.Guides)
  89. var resp *msg2.ResponseGmSetGuide
  90. res, err := config.GmNats.GmRequest(DB, "GmSetGuide", msg)
  91. if err != nil {
  92. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  93. }
  94. if err = json.Unmarshal(res, &resp); err != nil {
  95. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  96. }
  97. rpc_share.LogChan <- rpc_share.LogMsg{
  98. MsgID: msg.MsgId,
  99. Data: resp,
  100. }
  101. return serializer.Suc(req)
  102. }*/
  103. // UpdateChapter 更新关卡
  104. func (s *sGm) UpdateChapter(ctx *gin.Context, req forms.UpdateChapterReq) serializer.Response {
  105. var err error
  106. DB, err := player.GetDBByUserId(req.Playerid)
  107. if err != nil {
  108. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  109. }
  110. msgId := character.GenerateMsgId()
  111. var msg msg2.GmUpdateChapter
  112. if req.OneFull {
  113. msg = msg2.GmUpdateChapter{
  114. MsgId: msgId,
  115. PlayerID: req.Playerid,
  116. Chapters: NewFullChapters(true),
  117. }
  118. rpc_share.MsgMap[msgId] = fmt.Sprintf("GM为玩家[%d]一键通关", req.Playerid)
  119. } else if req.OneEmpty {
  120. msg = msg2.GmUpdateChapter{
  121. MsgId: msgId,
  122. PlayerID: req.Playerid,
  123. Chapters: NewFullChapters(false),
  124. }
  125. rpc_share.MsgMap[msgId] = fmt.Sprintf("GM清除了玩家[%d]的通关数据", req.Playerid)
  126. } else {
  127. msg = msg2.GmUpdateChapter{
  128. MsgId: msgId,
  129. PlayerID: req.Playerid,
  130. Chapters: NewPassChapters(req.PassChapters),
  131. }
  132. if len(msg.Chapters) == 0 {
  133. return serializer.Err(consts.CodeParamErr, "请选择一个有效的关卡", nil)
  134. }
  135. rpc_share.MsgMap[msgId] = fmt.Sprintf("GM为玩家[%d]通关了指定关卡:%v", req.Playerid, req.PassChapters)
  136. }
  137. var resp *msg2.ResponseGmUpdateChapter
  138. res, err := config.GmNats.GmRequest(DB, "GmUpdateChapter", msg)
  139. if err != nil {
  140. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  141. }
  142. if err = json.Unmarshal(res, &resp); err != nil {
  143. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  144. }
  145. rpc_share.LogChan <- rpc_share.LogMsg{
  146. MsgID: msg.MsgId,
  147. Data: resp,
  148. }
  149. return serializer.Suc(req)
  150. }
  151. func NewFullChapters(pass bool) map[int64]int64 {
  152. chapters := make(map[int64]int64, 3)
  153. if pass {
  154. chapters = gmdata.GetMaxChapterForType()
  155. }
  156. return chapters
  157. }
  158. func NewPassChapters(chapterStr []string) map[int64]int64 {
  159. chapters := make(map[int64]int64, 3)
  160. chapterMap := gmdata.GetChaptersMap()
  161. for _, chapter := range chapterStr {
  162. if data, ok := chapterMap[chapter]; ok {
  163. if _, ok1 := chapters[data.Type]; !ok1 || data.Uid > chapters[data.Type] {
  164. chapters[data.Type] = data.Uid
  165. }
  166. }
  167. }
  168. return chapters
  169. }
  170. /*// UpdateTalent 更新天赋
  171. func (s *sGm) UpdateTalent(ctx *gin.Context, req forms.UpdateTalentReq) serializer.Response {
  172. var (
  173. data = msg2.GmUpdateTalent{
  174. MsgId: character.GenerateMsgId(),
  175. PlayerID: req.Playerid,
  176. }
  177. err error
  178. )
  179. data.Talents = req.TalentInfo
  180. //if err = gate.SendToWorld(0, &msg); err == nil {
  181. // rpc_share.MsgMap[msg.MsgId] = fmt.Sprintf("GM为玩家[%d]修改天赋[%v]", req.Playerid, req.TalentInfo)
  182. //}
  183. DB, err := player.GetDBByUserId(req.Playerid)
  184. if err != nil {
  185. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  186. }
  187. rpc_share.MsgMap[data.MsgId] = fmt.Sprintf("GM为玩家[%d]修改天赋[%v]", req.Playerid, req.TalentInfo)
  188. var resp *msg2.ResponseGmUpdateTalent
  189. res, err := config.GmNats.GmRequest(DB, "GmUpdateTalent", data)
  190. if err != nil {
  191. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  192. }
  193. if err = json.Unmarshal(res, &resp); err != nil {
  194. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  195. }
  196. rpc_share.LogChan <- rpc_share.LogMsg{
  197. MsgID: data.MsgId,
  198. Data: resp,
  199. }
  200. return serializer.Suc(req)
  201. }
  202. // UpdatePlayerBase 更新玩家金币、钻石、 经验、体力、精力、天赋点
  203. func (s *sGm) UpdatePlayerBase(ctx *gin.Context, req forms.UpdatePlayerBaseReq) serializer.Response {
  204. playerAttr, err := player.GetAttrByUserId(req.Playerid)
  205. if err != nil {
  206. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  207. }
  208. DB, err := player.GetDBByPlayerAttr(playerAttr)
  209. if err != nil {
  210. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  211. }
  212. //获取userAccount
  213. var userAccountModel sqlModel.UserAccount
  214. err = config.LDB.WithContext(ctx).Scopes(sqlModel.UserAccountTable(&userAccountModel, playerAttr.AccID)).Where("accId = ?", playerAttr.AccID).First(&userAccountModel).Error
  215. if err != nil {
  216. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  217. }
  218. openIdArr := strings.Split(userAccountModel.Openid, "@")
  219. if req.Exp > 0 || req.TalentPoint != 0 {
  220. data := msg2.GmAddExp{
  221. MsgId: character.GenerateMsgId(),
  222. PlayerID: req.Playerid,
  223. Exp: req.Exp,
  224. TalentPoint: req.TalentPoint,
  225. }
  226. //if err = gate.SendToWorld(0, &data); err != nil {
  227. // return serializer.Err(consts.CodeParamErr, "更新玩家经验或天赋点失败", err)
  228. //}
  229. if req.Exp > 0 {
  230. rpc_share.MsgMap[data.MsgId] = fmt.Sprintf("GM为玩家[%d]添加经验[%d]", req.Playerid, req.Exp)
  231. }
  232. if req.TalentPoint > 0 {
  233. rpc_share.MsgMap[data.MsgId] = fmt.Sprintf("GM为玩家[%d]添加天赋[%d]", req.Playerid, req.TalentPoint)
  234. }
  235. var resp *msg2.ResponseGmAddExp
  236. res, err := config.GmNats.GmRequest(DB, "GmAddExp", data)
  237. if err != nil {
  238. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  239. }
  240. if err = json.Unmarshal(res, &resp); err != nil {
  241. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  242. }
  243. rpc_share.LogChan <- rpc_share.LogMsg{
  244. MsgID: data.MsgId,
  245. Data: resp,
  246. }
  247. }
  248. if req.Stamina != 0 || req.Energy != 0 {
  249. data := msg2.GmAddStama{
  250. MsgId: character.GenerateMsgId(),
  251. PlayerID: req.Playerid,
  252. Stama: req.Stamina,
  253. Energy: req.Energy,
  254. ClientPlat: openIdArr[1],
  255. }
  256. //if err = gate.SendToWorld(0, &msg); err != nil {
  257. // return serializer.Err(consts.CodeParamErr, "更新玩家体力或精力失败", err)
  258. //}
  259. rpc_share.MsgMap[data.MsgId] = fmt.Sprintf("GM为玩家[%d]更新体力[%d],精力[%d]", req.Playerid, req.Stamina, req.Energy)
  260. var resp *msg2.ResponseGmAddStama
  261. res, err := config.GmNats.GmRequest(DB, "GmAddStama", data)
  262. if err != nil {
  263. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  264. }
  265. if err = json.Unmarshal(res, &resp); err != nil {
  266. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  267. }
  268. rpc_share.LogChan <- rpc_share.LogMsg{
  269. MsgID: data.MsgId,
  270. Data: resp,
  271. }
  272. }
  273. if req.Diamond != 0 || req.Coin != 0 {
  274. data := msg2.GmAddMaterial{
  275. MsgId: character.GenerateMsgId(),
  276. PlayerID: req.Playerid,
  277. Materials: []*model.DropMaterial{{constants.MaterilaId_Diamond, req.Diamond}, {constants.MaterilaId_Coin, req.Coin}},
  278. ClientPlat: openIdArr[1],
  279. }
  280. //if err = gate.SendToWorld(0, &msg); err != nil {
  281. // return serializer.Err(consts.CodeParamErr, "更新玩家变更钻石或金币失败", err)
  282. //}
  283. rpc_share.MsgMap[data.MsgId] = fmt.Sprintf("GM为玩家[%d]变更钻石[%d],金币[%d] ", req.Playerid, req.Diamond, req.Coin)
  284. var resp *msg2.ResponseGmAddMaterial
  285. res, err := config.GmNats.GmRequest(DB, "GmAddMaterial", data)
  286. if err != nil {
  287. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  288. }
  289. if err = json.Unmarshal(res, &resp); err != nil {
  290. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  291. }
  292. rpc_share.LogChan <- rpc_share.LogMsg{
  293. MsgID: data.MsgId,
  294. Data: resp,
  295. }
  296. }
  297. return serializer.Suc(req)
  298. }*/