gm.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383
  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. if req.OneFull {
  112. msg := msg2.GmUpdateChapter{
  113. MsgId: msgId,
  114. PlayerID: req.Playerid,
  115. Chapters: NewFullChapters(true),
  116. }
  117. rpc_share.MsgMap[msgId] = fmt.Sprintf("GM为玩家[%d]一键通关", req.Playerid)
  118. var resp *msg2.ResponseGmUpdateChapter
  119. res, err := config.GmNats.GmRequest(DB, "GmUpdateChapter", msg)
  120. if err != nil {
  121. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  122. }
  123. if err = json.Unmarshal(res, &resp); err != nil {
  124. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  125. }
  126. rpc_share.LogChan <- rpc_share.LogMsg{
  127. MsgID: msg.MsgId,
  128. Data: resp,
  129. }
  130. } else if req.OneEmpty {
  131. msg := msg2.GmUpdateChapter{
  132. MsgId: msgId,
  133. PlayerID: req.Playerid,
  134. Chapters: NewFullChapters(false),
  135. }
  136. rpc_share.MsgMap[msgId] = fmt.Sprintf("GM清除了玩家[%d]的通关数据", req.Playerid)
  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. } else {
  150. msg := msg2.GmUpdateChapter{
  151. MsgId: msgId,
  152. PlayerID: req.Playerid,
  153. Chapters: NewPassChapters(req.PassChapters),
  154. }
  155. if len(msg.Chapters) == 0 {
  156. return serializer.Err(consts.CodeParamErr, "请选择一个有效的关卡", nil)
  157. }
  158. rpc_share.MsgMap[msgId] = fmt.Sprintf("GM为玩家[%d]通关了指定关卡:%v", req.Playerid, req.PassChapters)
  159. var resp *msg2.ResponseGmUpdateChapter
  160. res, err := config.GmNats.GmRequest(DB, "GmUpdateChapter", msg)
  161. if err != nil {
  162. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  163. }
  164. if err = json.Unmarshal(res, &resp); err != nil {
  165. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  166. }
  167. rpc_share.LogChan <- rpc_share.LogMsg{
  168. MsgID: msg.MsgId,
  169. Data: resp,
  170. }
  171. }
  172. return serializer.Suc(req)
  173. }
  174. func NewFullChapters(pass bool) []int64 {
  175. var chapters []int64
  176. if !pass {
  177. return chapters
  178. }
  179. for _, chapter := range gmdata.Chapters {
  180. chapters = append(chapters, chapter.Uid)
  181. }
  182. return chapters
  183. }
  184. func NewPassChapters(chapterStr []string) []int64 {
  185. var chapters []int64
  186. chapterMap := gmdata.GetChaptersMap()
  187. for _, chapter := range chapterStr {
  188. if data, ok := chapterMap[chapter]; ok {
  189. chapters = append(chapters, data.Uid)
  190. }
  191. }
  192. return chapters
  193. }
  194. /*// UpdateTalent 更新天赋
  195. func (s *sGm) UpdateTalent(ctx *gin.Context, req forms.UpdateTalentReq) serializer.Response {
  196. var (
  197. data = msg2.GmUpdateTalent{
  198. MsgId: character.GenerateMsgId(),
  199. PlayerID: req.Playerid,
  200. }
  201. err error
  202. )
  203. data.Talents = req.TalentInfo
  204. //if err = gate.SendToWorld(0, &msg); err == nil {
  205. // rpc_share.MsgMap[msg.MsgId] = fmt.Sprintf("GM为玩家[%d]修改天赋[%v]", req.Playerid, req.TalentInfo)
  206. //}
  207. DB, err := player.GetDBByUserId(req.Playerid)
  208. if err != nil {
  209. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  210. }
  211. rpc_share.MsgMap[data.MsgId] = fmt.Sprintf("GM为玩家[%d]修改天赋[%v]", req.Playerid, req.TalentInfo)
  212. var resp *msg2.ResponseGmUpdateTalent
  213. res, err := config.GmNats.GmRequest(DB, "GmUpdateTalent", data)
  214. if err != nil {
  215. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  216. }
  217. if err = json.Unmarshal(res, &resp); err != nil {
  218. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  219. }
  220. rpc_share.LogChan <- rpc_share.LogMsg{
  221. MsgID: data.MsgId,
  222. Data: resp,
  223. }
  224. return serializer.Suc(req)
  225. }
  226. // UpdatePlayerBase 更新玩家金币、钻石、 经验、体力、精力、天赋点
  227. func (s *sGm) UpdatePlayerBase(ctx *gin.Context, req forms.UpdatePlayerBaseReq) serializer.Response {
  228. playerAttr, err := player.GetAttrByUserId(req.Playerid)
  229. if err != nil {
  230. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  231. }
  232. DB, err := player.GetDBByPlayerAttr(playerAttr)
  233. if err != nil {
  234. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  235. }
  236. //获取userAccount
  237. var userAccountModel sqlModel.UserAccount
  238. err = config.LDB.WithContext(ctx).Scopes(sqlModel.UserAccountTable(&userAccountModel, playerAttr.AccID)).Where("accId = ?", playerAttr.AccID).First(&userAccountModel).Error
  239. if err != nil {
  240. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  241. }
  242. openIdArr := strings.Split(userAccountModel.Openid, "@")
  243. if req.Exp > 0 || req.TalentPoint != 0 {
  244. data := msg2.GmAddExp{
  245. MsgId: character.GenerateMsgId(),
  246. PlayerID: req.Playerid,
  247. Exp: req.Exp,
  248. TalentPoint: req.TalentPoint,
  249. }
  250. //if err = gate.SendToWorld(0, &data); err != nil {
  251. // return serializer.Err(consts.CodeParamErr, "更新玩家经验或天赋点失败", err)
  252. //}
  253. if req.Exp > 0 {
  254. rpc_share.MsgMap[data.MsgId] = fmt.Sprintf("GM为玩家[%d]添加经验[%d]", req.Playerid, req.Exp)
  255. }
  256. if req.TalentPoint > 0 {
  257. rpc_share.MsgMap[data.MsgId] = fmt.Sprintf("GM为玩家[%d]添加天赋[%d]", req.Playerid, req.TalentPoint)
  258. }
  259. var resp *msg2.ResponseGmAddExp
  260. res, err := config.GmNats.GmRequest(DB, "GmAddExp", data)
  261. if err != nil {
  262. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  263. }
  264. if err = json.Unmarshal(res, &resp); err != nil {
  265. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  266. }
  267. rpc_share.LogChan <- rpc_share.LogMsg{
  268. MsgID: data.MsgId,
  269. Data: resp,
  270. }
  271. }
  272. if req.Stamina != 0 || req.Energy != 0 {
  273. data := msg2.GmAddStama{
  274. MsgId: character.GenerateMsgId(),
  275. PlayerID: req.Playerid,
  276. Stama: req.Stamina,
  277. Energy: req.Energy,
  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.Stamina, req.Energy)
  284. var resp *msg2.ResponseGmAddStama
  285. res, err := config.GmNats.GmRequest(DB, "GmAddStama", 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. if req.Diamond != 0 || req.Coin != 0 {
  298. data := msg2.GmAddMaterial{
  299. MsgId: character.GenerateMsgId(),
  300. PlayerID: req.Playerid,
  301. Materials: []*model.DropMaterial{{constants.MaterilaId_Diamond, req.Diamond}, {constants.MaterilaId_Coin, req.Coin}},
  302. ClientPlat: openIdArr[1],
  303. }
  304. //if err = gate.SendToWorld(0, &msg); err != nil {
  305. // return serializer.Err(consts.CodeParamErr, "更新玩家变更钻石或金币失败", err)
  306. //}
  307. rpc_share.MsgMap[data.MsgId] = fmt.Sprintf("GM为玩家[%d]变更钻石[%d],金币[%d] ", req.Playerid, req.Diamond, req.Coin)
  308. var resp *msg2.ResponseGmAddMaterial
  309. res, err := config.GmNats.GmRequest(DB, "GmAddMaterial", data)
  310. if err != nil {
  311. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  312. }
  313. if err = json.Unmarshal(res, &resp); err != nil {
  314. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  315. }
  316. rpc_share.LogChan <- rpc_share.LogMsg{
  317. MsgID: data.MsgId,
  318. Data: resp,
  319. }
  320. }
  321. return serializer.Suc(req)
  322. }*/