123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350 |
- package jobs
- /*
- import (
- "encoding/json"
- "errors"
- "fmt"
- "gadmin/config"
- model2 "gadmin/internal/gorm/model"
- "gadmin/internal/gorm/query"
- "gadmin/package/gmdata"
- "github.com/sirupsen/logrus"
- "gorm.io/gen"
- "leafstalk/grave/constants"
- "leafstalk/grave/model"
- "log"
- "os"
- "time"
- )
- var EquipmentStill = new(jEquipmentStill)
- type jEquipmentStill struct{}
- type Extract struct {
- NeedExtract bool // 是否需要返还
- Coin int64 // 返还的金币
- StartEquipment model.DropEquipment // 1级的装备
- Material model.DropMaterial // 返还后的材料
- }
- var extractMap = make(map[int64]Extract)
- func (j *jEquipmentStill) Run() {
- logrus.Info("jEquipmentStill Run.....")
- j.loadExtractMap()
- j.saveMaterial()
- }
- func (j *jEquipmentStill) loadExtractMap() {
- if err := gmdata.Load(os.Getenv("JSON_PATH") + "/" + os.Getenv("JSON_VERSION")); err != nil {
- logrus.Info("gmdata.Load err:", err)
- return
- }
- for _, equipment := range gmdata.EquipmentDict {
- // 一级装备 DecoMaterial多维数组 0是id 1是数量
- if equipment.Equiplev == 1 { // && equipment.Star == 1
- extractMap[equipment.LevelId] = Extract{
- NeedExtract: false,
- Coin: equipment.DecoMaterial[0][1],
- StartEquipment: model.DropEquipment{EID: equipment.LevelId},
- Material: model.DropMaterial{ID: equipment.DecoMaterial[1][0], Count: int(equipment.DecoMaterial[1][1])},
- }
- continue
- }
- startIndex := gmdata.GetEquipmentStartID(equipment.LevelId)
- start := extractMap[startIndex]
- extractMap[equipment.LevelId] = Extract{
- NeedExtract: true,
- Coin: equipment.DecoMaterial[0][1] - start.Coin,
- StartEquipment: start.StartEquipment,
- Material: model.DropMaterial{ID: equipment.DecoMaterial[1][0], Count: int(equipment.DecoMaterial[1][1]) - start.Material.Count},
- }
- //logrus.Warningf("start:%+v, EID:%+v, extractMap[equipment.LevelId]:%+v \r\n", start, equipment.LevelId, extractMap[equipment.LevelId])
- }
- //logrus.Warningf("extractMap:%+v", extractMap)
- }
- func (j *jEquipmentStill) instBody() model.StillBodyParts {
- var body model.StillBodyParts
- for k, _ := range body {
- body[k].Part = int64(k + 1)
- body[k].Level = 1
- }
- return body
- }
- type DropEquipment struct {
- model.DropEquipment
- IsInlay bool
- }
- func (j *jEquipmentStill) saveMaterial() {
- // .Where(u.ID.Eq(1)) .Where(u.Playerid.Gt(17367)) .Where(u.Playerid.Eq(74998)) .Where(u.Playerid.Eq(653921))
- var (
- results []*model2.PlayerMaterial
- a = query.Use(config.GDB1).PlayerAttr
- u = query.Use(config.GDB1).PlayerMaterial
- instBody = j.instBody()
- )
- err := u.Select(u.ID, u.Playerid, u.Coin, u.Equipments, u.Body).
- LeftJoin(a, a.Playerid.EqCol(u.Playerid)).
- Where(a.Level.Gte(2)).
- //Where(u.Playerid.Eq(577636)).
- Where(u.Body.Null()).
- FindInBatches(&results, 1000, func(tx gen.Dao, batch int) error {
- for _, result := range results {
- logrus.Infof("playerid :%+v", result.Playerid)
- var (
- oldEquipments map[string]DropEquipment
- newBody model.StillBodyParts
- oldBody = instBody
- newEquipments = make(map[string]model.DropEquipment)
- stillMaterials = make(map[int64]model.DropMaterial)
- addCoin int64
- change bool
- )
- if err := json.Unmarshal([]byte(result.Equipments), &oldEquipments); err != nil {
- logrus.Warningf("Unmarshal Equipments err:%+v", err)
- return err
- }
- if result.Body != "" {
- if err := json.Unmarshal([]byte(result.Body), &oldBody); err != nil {
- logrus.Warningf("Unmarshal oldBody err:%+v, result.Body:%+v", err, result.Body)
- return err
- }
- }
- handleEquipments, handleBody, bodyChange := j.bodyHandle(oldBody, oldEquipments)
- // 部位变动
- if !bodyChange {
- logrus.Warningf("无需更新跳过 oldEquipments:%+v", oldEquipments)
- continue
- }
- newBody = handleBody
- for _, oldEquipment := range handleEquipments {
- extract, ok := extractMap[oldEquipment.EID]
- if !ok {
- return errors.New(fmt.Sprintf("oldEquipment 获取映射失败:%+v", oldEquipment))
- }
- sChange, coin, newEquipment, newStillMaterials := j.stillHandle(extract, oldEquipment, stillMaterials)
- newEquipments[newEquipment.GID] = model.DropEquipment{
- GID: newEquipment.GID,
- EID: newEquipment.EID,
- //Wear: newEquipment.Wear,
- }
- if sChange {
- change = true
- addCoin += coin
- stillMaterials = newStillMaterials
- }
- //logrus.Warningf("oldEquipment:%+v, newStillMaterials:%+v", oldEquipment, newStillMaterials)
- }
- equip, err := json.Marshal(newEquipments)
- if err != nil {
- logrus.Warningf("json.Marshal newEquipments err :%+v", err)
- return err
- }
- body, err := json.Marshal(newBody)
- if err != nil {
- logrus.Warningf("json.Marshal body err:%+v", err)
- return err
- }
- //logrus.Warningf("equip:%+v \r\nbody:%+v", string(equip), string(body))
- if change {
- //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)
- data := model2.PlayerMaterial{
- Equipments: string(equip),
- Body: string(body),
- }
- if _, err = query.Use(config.GDB1).PlayerMaterial.
- Where(u.Playerid.Eq(result.Playerid)).
- Updates(&data); err != nil {
- logrus.Warnf("PlayerMaterial Updates err . %v", err)
- return err
- }
- if addCoin > 0 || len(stillMaterials) > 0 {
- if err = j.addLetter(result.Playerid, addCoin, stillMaterials); err != nil {
- return err
- }
- }
- } else {
- // 没有装备被更新,则只更新部位
- data := model2.PlayerMaterial{
- Body: string(body),
- }
- if _, err = query.Use(config.GDB1).PlayerMaterial.
- Where(u.Playerid.Eq(result.Playerid)).
- Updates(&data); err != nil {
- logrus.Warnf("PlayerMaterial Updates2 err . %v", err)
- return err
- }
- }
- }
- return nil
- })
- if err != nil {
- panic(err)
- } else {
- log.Println("update finished")
- }
- }
- // addLetter 将返还材料添加到邮件
- func (j *jEquipmentStill) addLetter(playerID int64, coin int64, materials map[int64]model.DropMaterial) error {
- var (
- data model.ExtraData
- l = query.Use(config.GDB1).PlayerLetter
- t = time.Now()
- letter = model2.PlayerLetter{
- PlayerID: playerID,
- Type: 13,
- CreateTime: t,
- DisplayTime: t,
- ExpireTime: t.Add(time.Second * 86400 * 30),
- }
- )
- for _, v := range materials {
- data.Materials = append(data.Materials, &model.DropMaterial{ID: v.ID, Count: v.Count})
- }
- if coin > 0 {
- data.Materials = append(data.Materials, &model.DropMaterial{ID: constants.MaterilaId_Coin, Count: int(coin)})
- }
- extra, err := json.Marshal(data)
- if err != nil {
- logrus.Warningf("addLetter json.Marshal extra err :%+v", err)
- return err
- }
- letter.Extra = string(extra)
- if err = l.Create(&letter); err != nil {
- logrus.Warningf("addLetter Create err :%+v", err)
- return err
- }
- return nil
- }
- // bodyHandle 处理部位继承强化等级
- func (j *jEquipmentStill) bodyHandle(body model.StillBodyParts, equipments map[string]DropEquipment) (map[string]DropEquipment, model.StillBodyParts, bool) {
- var (
- newEquipments = make(map[string]DropEquipment)
- needChange bool
- )
- for _, equipment := range equipments {
- equip := gmdata.GetEquipment(equipment.EID)
- selfChange := false
- for k, v := range body {
- if int64(v.Part) == equip.BodyId && equip.LevelId >= int64(v.Level) {
- // 存在镶嵌装备 则卸下
- if v.Equip != "" {
- original := equipments[v.Equip]
- original.IsInlay = false
- newEquipments[v.Equip] = original
- }
- body[k].Level = equip.LevelId
- body[k].Equip = equipment.GID
- equipment.IsInlay = true
- newEquipments[equipment.GID] = equipment
- //if equip.Level > 1 {
- // needChange = true
- //}
- needChange = true
- selfChange = true
- continue
- }
- }
- if !selfChange {
- newEquipments[equipment.GID] = equipment
- }
- }
- return newEquipments, body, needChange
- }
- // stillHandle 处理返还材料
- func (j *jEquipmentStill) stillHandle(extract Extract, oldEquipment DropEquipment, stillMaterials map[int64]model.DropMaterial) (bool, int64, DropEquipment, map[int64]model.DropMaterial) {
- var (
- change bool
- addCoin int64
- newEquipment DropEquipment
- )
- if extract.NeedExtract {
- // 需要返还
- newEquipment.GID = oldEquipment.GID
- newEquipment.Wear = false
- newEquipment.EID = extract.StartEquipment.EID
- if !oldEquipment.IsInlay {
- // 返还金币
- addCoin += extract.Coin
- // 返还材料
- _, ok := stillMaterials[extract.Material.ID]
- if ok {
- stillMaterials[extract.Material.ID] = model.DropMaterial{
- ID: extract.Material.ID,
- Count: extract.Material.Count + stillMaterials[extract.Material.ID].Count,
- }
- } else {
- stillMaterials[extract.Material.ID] = model.DropMaterial{
- ID: extract.Material.ID,
- Count: extract.Material.Count,
- }
- }
- }
- if oldEquipment.IsInlay {
- newEquipment.Wear = true
- }
- change = true
- } else {
- // 不需要返还 直接重新加入到装备列表
- newEquipment = oldEquipment
- // 没有镶嵌且是穿戴状态 则卸下
- if !oldEquipment.IsInlay && oldEquipment.Wear == true {
- newEquipment.Wear = false
- change = true
- }
- if oldEquipment.IsInlay {
- newEquipment.Wear = true
- }
- }
- return change, addCoin, newEquipment, stillMaterials
- }
- */
|