equipment_still.go 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
  1. package jobs
  2. /*
  3. import (
  4. "encoding/json"
  5. "errors"
  6. "fmt"
  7. "gadmin/config"
  8. model2 "gadmin/internal/gorm/model"
  9. "gadmin/internal/gorm/query"
  10. "gadmin/package/gmdata"
  11. "github.com/sirupsen/logrus"
  12. "gorm.io/gen"
  13. "leafstalk/grave/constants"
  14. "leafstalk/grave/model"
  15. "log"
  16. "os"
  17. "time"
  18. )
  19. var EquipmentStill = new(jEquipmentStill)
  20. type jEquipmentStill struct{}
  21. type Extract struct {
  22. NeedExtract bool // 是否需要返还
  23. Coin int64 // 返还的金币
  24. StartEquipment model.DropEquipment // 1级的装备
  25. Material model.DropMaterial // 返还后的材料
  26. }
  27. var extractMap = make(map[int64]Extract)
  28. func (j *jEquipmentStill) Run() {
  29. logrus.Info("jEquipmentStill Run.....")
  30. j.loadExtractMap()
  31. j.saveMaterial()
  32. }
  33. func (j *jEquipmentStill) loadExtractMap() {
  34. if err := gmdata.Load(os.Getenv("JSON_PATH") + "/" + os.Getenv("JSON_VERSION")); err != nil {
  35. logrus.Info("gmdata.Load err:", err)
  36. return
  37. }
  38. for _, equipment := range gmdata.EquipmentDict {
  39. // 一级装备 DecoMaterial多维数组 0是id 1是数量
  40. if equipment.Equiplev == 1 { // && equipment.Star == 1
  41. extractMap[equipment.LevelId] = Extract{
  42. NeedExtract: false,
  43. Coin: equipment.DecoMaterial[0][1],
  44. StartEquipment: model.DropEquipment{EID: equipment.LevelId},
  45. Material: model.DropMaterial{ID: equipment.DecoMaterial[1][0], Count: int(equipment.DecoMaterial[1][1])},
  46. }
  47. continue
  48. }
  49. startIndex := gmdata.GetEquipmentStartID(equipment.LevelId)
  50. start := extractMap[startIndex]
  51. extractMap[equipment.LevelId] = Extract{
  52. NeedExtract: true,
  53. Coin: equipment.DecoMaterial[0][1] - start.Coin,
  54. StartEquipment: start.StartEquipment,
  55. Material: model.DropMaterial{ID: equipment.DecoMaterial[1][0], Count: int(equipment.DecoMaterial[1][1]) - start.Material.Count},
  56. }
  57. //logrus.Warningf("start:%+v, EID:%+v, extractMap[equipment.LevelId]:%+v \r\n", start, equipment.LevelId, extractMap[equipment.LevelId])
  58. }
  59. //logrus.Warningf("extractMap:%+v", extractMap)
  60. }
  61. func (j *jEquipmentStill) instBody() model.StillBodyParts {
  62. var body model.StillBodyParts
  63. for k, _ := range body {
  64. body[k].Part = int64(k + 1)
  65. body[k].Level = 1
  66. }
  67. return body
  68. }
  69. type DropEquipment struct {
  70. model.DropEquipment
  71. IsInlay bool
  72. }
  73. func (j *jEquipmentStill) saveMaterial() {
  74. // .Where(u.ID.Eq(1)) .Where(u.Playerid.Gt(17367)) .Where(u.Playerid.Eq(74998)) .Where(u.Playerid.Eq(653921))
  75. var (
  76. results []*model2.PlayerMaterial
  77. a = query.Use(config.GDB1).PlayerAttr
  78. u = query.Use(config.GDB1).PlayerMaterial
  79. instBody = j.instBody()
  80. )
  81. err := u.Select(u.ID, u.Playerid, u.Coin, u.Equipments, u.Body).
  82. LeftJoin(a, a.Playerid.EqCol(u.Playerid)).
  83. Where(a.Level.Gte(2)).
  84. //Where(u.Playerid.Eq(577636)).
  85. Where(u.Body.Null()).
  86. FindInBatches(&results, 1000, func(tx gen.Dao, batch int) error {
  87. for _, result := range results {
  88. logrus.Infof("playerid :%+v", result.Playerid)
  89. var (
  90. oldEquipments map[string]DropEquipment
  91. newBody model.StillBodyParts
  92. oldBody = instBody
  93. newEquipments = make(map[string]model.DropEquipment)
  94. stillMaterials = make(map[int64]model.DropMaterial)
  95. addCoin int64
  96. change bool
  97. )
  98. if err := json.Unmarshal([]byte(result.Equipments), &oldEquipments); err != nil {
  99. logrus.Warningf("Unmarshal Equipments err:%+v", err)
  100. return err
  101. }
  102. if result.Body != "" {
  103. if err := json.Unmarshal([]byte(result.Body), &oldBody); err != nil {
  104. logrus.Warningf("Unmarshal oldBody err:%+v, result.Body:%+v", err, result.Body)
  105. return err
  106. }
  107. }
  108. handleEquipments, handleBody, bodyChange := j.bodyHandle(oldBody, oldEquipments)
  109. // 部位变动
  110. if !bodyChange {
  111. logrus.Warningf("无需更新跳过 oldEquipments:%+v", oldEquipments)
  112. continue
  113. }
  114. newBody = handleBody
  115. for _, oldEquipment := range handleEquipments {
  116. extract, ok := extractMap[oldEquipment.EID]
  117. if !ok {
  118. return errors.New(fmt.Sprintf("oldEquipment 获取映射失败:%+v", oldEquipment))
  119. }
  120. sChange, coin, newEquipment, newStillMaterials := j.stillHandle(extract, oldEquipment, stillMaterials)
  121. newEquipments[newEquipment.GID] = model.DropEquipment{
  122. GID: newEquipment.GID,
  123. EID: newEquipment.EID,
  124. //Wear: newEquipment.Wear,
  125. }
  126. if sChange {
  127. change = true
  128. addCoin += coin
  129. stillMaterials = newStillMaterials
  130. }
  131. //logrus.Warningf("oldEquipment:%+v, newStillMaterials:%+v", oldEquipment, newStillMaterials)
  132. }
  133. equip, err := json.Marshal(newEquipments)
  134. if err != nil {
  135. logrus.Warningf("json.Marshal newEquipments err :%+v", err)
  136. return err
  137. }
  138. body, err := json.Marshal(newBody)
  139. if err != nil {
  140. logrus.Warningf("json.Marshal body err:%+v", err)
  141. return err
  142. }
  143. //logrus.Warningf("equip:%+v \r\nbody:%+v", string(equip), string(body))
  144. if change {
  145. //logrus.Warningf("result.Playerid :%+v, \r\n newEquipments:%+v , \r\n newBody:%+v, \r\n stillMaterials:%+v, addCoin:%+v ", result.Playerid, newEquipments, newBody, stillMaterials, addCoin)
  146. data := model2.PlayerMaterial{
  147. Equipments: string(equip),
  148. Body: string(body),
  149. }
  150. if _, err = query.Use(config.GDB1).PlayerMaterial.
  151. Where(u.Playerid.Eq(result.Playerid)).
  152. Updates(&data); err != nil {
  153. logrus.Warnf("PlayerMaterial Updates err . %v", err)
  154. return err
  155. }
  156. if addCoin > 0 || len(stillMaterials) > 0 {
  157. if err = j.addLetter(result.Playerid, addCoin, stillMaterials); err != nil {
  158. return err
  159. }
  160. }
  161. } else {
  162. // 没有装备被更新,则只更新部位
  163. data := model2.PlayerMaterial{
  164. Body: string(body),
  165. }
  166. if _, err = query.Use(config.GDB1).PlayerMaterial.
  167. Where(u.Playerid.Eq(result.Playerid)).
  168. Updates(&data); err != nil {
  169. logrus.Warnf("PlayerMaterial Updates2 err . %v", err)
  170. return err
  171. }
  172. }
  173. }
  174. return nil
  175. })
  176. if err != nil {
  177. panic(err)
  178. } else {
  179. log.Println("update finished")
  180. }
  181. }
  182. // addLetter 将返还材料添加到邮件
  183. func (j *jEquipmentStill) addLetter(playerID int64, coin int64, materials map[int64]model.DropMaterial) error {
  184. var (
  185. data model.ExtraData
  186. l = query.Use(config.GDB1).PlayerLetter
  187. t = time.Now()
  188. letter = model2.PlayerLetter{
  189. PlayerID: playerID,
  190. Type: 13,
  191. CreateTime: t,
  192. DisplayTime: t,
  193. ExpireTime: t.Add(time.Second * 86400 * 30),
  194. }
  195. )
  196. for _, v := range materials {
  197. data.Materials = append(data.Materials, &model.DropMaterial{ID: v.ID, Count: v.Count})
  198. }
  199. if coin > 0 {
  200. data.Materials = append(data.Materials, &model.DropMaterial{ID: constants.MaterilaId_Coin, Count: int(coin)})
  201. }
  202. extra, err := json.Marshal(data)
  203. if err != nil {
  204. logrus.Warningf("addLetter json.Marshal extra err :%+v", err)
  205. return err
  206. }
  207. letter.Extra = string(extra)
  208. if err = l.Create(&letter); err != nil {
  209. logrus.Warningf("addLetter Create err :%+v", err)
  210. return err
  211. }
  212. return nil
  213. }
  214. // bodyHandle 处理部位继承强化等级
  215. func (j *jEquipmentStill) bodyHandle(body model.StillBodyParts, equipments map[string]DropEquipment) (map[string]DropEquipment, model.StillBodyParts, bool) {
  216. var (
  217. newEquipments = make(map[string]DropEquipment)
  218. needChange bool
  219. )
  220. for _, equipment := range equipments {
  221. equip := gmdata.GetEquipment(equipment.EID)
  222. selfChange := false
  223. for k, v := range body {
  224. if int64(v.Part) == equip.BodyId && equip.LevelId >= int64(v.Level) {
  225. // 存在镶嵌装备 则卸下
  226. if v.Equip != "" {
  227. original := equipments[v.Equip]
  228. original.IsInlay = false
  229. newEquipments[v.Equip] = original
  230. }
  231. body[k].Level = equip.LevelId
  232. body[k].Equip = equipment.GID
  233. equipment.IsInlay = true
  234. newEquipments[equipment.GID] = equipment
  235. //if equip.Level > 1 {
  236. // needChange = true
  237. //}
  238. needChange = true
  239. selfChange = true
  240. continue
  241. }
  242. }
  243. if !selfChange {
  244. newEquipments[equipment.GID] = equipment
  245. }
  246. }
  247. return newEquipments, body, needChange
  248. }
  249. // stillHandle 处理返还材料
  250. func (j *jEquipmentStill) stillHandle(extract Extract, oldEquipment DropEquipment, stillMaterials map[int64]model.DropMaterial) (bool, int64, DropEquipment, map[int64]model.DropMaterial) {
  251. var (
  252. change bool
  253. addCoin int64
  254. newEquipment DropEquipment
  255. )
  256. if extract.NeedExtract {
  257. // 需要返还
  258. newEquipment.GID = oldEquipment.GID
  259. newEquipment.Wear = false
  260. newEquipment.EID = extract.StartEquipment.EID
  261. if !oldEquipment.IsInlay {
  262. // 返还金币
  263. addCoin += extract.Coin
  264. // 返还材料
  265. _, ok := stillMaterials[extract.Material.ID]
  266. if ok {
  267. stillMaterials[extract.Material.ID] = model.DropMaterial{
  268. ID: extract.Material.ID,
  269. Count: extract.Material.Count + stillMaterials[extract.Material.ID].Count,
  270. }
  271. } else {
  272. stillMaterials[extract.Material.ID] = model.DropMaterial{
  273. ID: extract.Material.ID,
  274. Count: extract.Material.Count,
  275. }
  276. }
  277. }
  278. if oldEquipment.IsInlay {
  279. newEquipment.Wear = true
  280. }
  281. change = true
  282. } else {
  283. // 不需要返还 直接重新加入到装备列表
  284. newEquipment = oldEquipment
  285. // 没有镶嵌且是穿戴状态 则卸下
  286. if !oldEquipment.IsInlay && oldEquipment.Wear == true {
  287. newEquipment.Wear = false
  288. change = true
  289. }
  290. if oldEquipment.IsInlay {
  291. newEquipment.Wear = true
  292. }
  293. }
  294. return change, addCoin, newEquipment, stillMaterials
  295. }
  296. */