gm.go 12 KB

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