package logic import ( "HttpServer/jsonconf" "HttpServer/redishandler" "common/logger" "common/redis" "encoding/json" "strconv" "time" ) func SaveUserInfo(data *UserData, uniqueid string) error { savestr, err := json.Marshal(data) if err != nil { return err } err = redishandler.GetRedisClient().HSet(redis.USER_INFO__KEY, uniqueid, string(savestr)) return err } func GetUserInfo(uid string) (*UserData, error) { data, err := redishandler.GetRedisClient().HGet(redis.USER_INFO__KEY, uid) if err != nil { return nil, err } var tmp UserData err = json.Unmarshal([]byte(data), &tmp) if err != nil { return nil, err } return &tmp, nil } //初始化玩家信息 func InitUserInfo(data *UserLoginReq, resp *UserLoginResp, uuid int) { udata := new(UserData) udata.Gold = 100000 udata.GoldSum += udata.Gold udata.Love = 0 udata.InviteId = data.Fromid udata.Highestlv = 0 udata.CurBoxLv = 1 udata.IsDouble = 0 udata.IsAuto = 0 udata.IsBoxAcc = 0 udata.RandGiftDay = time.Now().Day() udata.RandGiftNum = 6 udata.RandGiftTime = int(time.Now().Unix()) udata.Redbag = 0 udata.IsFirstRedBgCat = 0 //初始化16个猫爬架 for i := 0; i < 16; i++ { var d1 PosData d1.Pos = i d1.Catlv = 0 udata.PosInfo = append(udata.PosInfo, d1) var d2 DataDesc d2.Pos = i d2.Catlv = 0 } udata.Goldrate = 0 udata.Loverate = 0 //初始化商店信息 initcatcfg := jsonconf.GetCatConfig(1) if initcatcfg == nil { logger.Error("get 1catcfg err") return } var info BuyCatInfoData info.Buytime = 0 info.CurPrice, _ = strconv.ParseInt(initcatcfg.Price, 10, 64) info.IsMaxBuytime = 0 udata.BuyCatInfo = append(udata.BuyCatInfo, info) //初始化猫咖门店数据 udata.CatShopInfo.LeftTime = 0 udata.CatShopInfo.Chapter = 1 udata.CatShopInfo.DayNum = time.Now().Day() udata.CatShopInfo.IsPlaying = 0 udata.CatShopInfo.PlayTimes = 0 udata.CatShopInfo.Section = 1 udata.CatShopInfo.ThisIsWatch = 0 udata.CatShopInfo.TotalWatchNumLeft = 8 // logger.Info("Init user data=%v", udata) //保存redis SaveUserInfo(udata, strconv.Itoa(uuid)) //初始化玩家仓库信息 pware := new(UserWareHouseData) for i := 0; i < 15; i++ { var tmp WareHouseDesc tmp.Warelv = 0 pware.Info = append(pware.Info, tmp) } wares, err := json.Marshal(pware) if err != nil { logger.Info("InitUserInfo warehouse failed err=%v", err) } redishandler.GetRedisClient().HSet(redis.USER_WAREHOUSE_INFO, strconv.Itoa(uuid), string(wares)) //保存此次计算时间 nowtimestr := strconv.Itoa(int(time.Now().Unix())) redishandler.GetRedisClient().HSet(redis.USER_LAST_CALC_TIME, strconv.Itoa(uuid), nowtimestr) } //计算购买后猫箱子的位置,将箱子放到对应位置 返回值表示位置 -1表示失败都满了 func getCatPutPos(uinfo *UserData, clv int) int { pos := -1 for k, v := range uinfo.PosInfo { if v.Catlv == 0 { uinfo.PosInfo[k].Catlv = clv uinfo.PosInfo[k].Pos = k //v.Catlv = clv //v.Pos = k pos = k break } } return pos } func (udata *UserData) CalcGoldRate() int64 { //计算出所有速率的和 //计算方式为 首先计算合成界面猫的产出速率,然后计算红毛包的产出速率,最后计算仓库中的猫的产出速率 var sumrate int64 cfg37 := jsonconf.GetCatConfig(37) if cfg37 == nil { logger.Error("37cfg err!!") return 0 } for _, v := range udata.PosInfo { if v.Catlv > 0 && v.Catlv < 100 { //有猫存在的要计算一下 //非红包猫 for _, vv := range jsonconf.GetJsonConf().CatConfig { if vv.Id == v.Catlv { onerate, _ := strconv.ParseInt(vv.Gold_get, 10, 64) sumrate += onerate break } } } if v.Catlv > 100 { //红包猫 需要判断是否产金币 rcfg := jsonconf.GetRedCatConfig(v.Catlv) if rcfg != nil { if rcfg.Is_37 != 0 { onerate, _ := strconv.ParseInt(cfg37.Gold_get, 10, 64) sumrate += onerate } } else { logger.Error("GetRedCatConfig failed lv=%v", v.Catlv) } } } udatastr, err := redishandler.GetRedisClient().HGet(redis.USER_WAREHOUSE_INFO, strconv.Itoa(udata.UserId)) if err != nil { logger.Error("CalcGoldRate failed err=%v", err) return sumrate } wdata := new(UserWareHouseData) err = json.Unmarshal([]byte(udatastr), wdata) if err != nil { logger.Error("CalcGoldRate Unmarshal redis failed ") return sumrate } for _, v := range wdata.Info { rcfg := jsonconf.GetRedCatConfig(v.Warelv + 100) if rcfg != nil { if rcfg.Is_37 != 0 { onerate, _ := strconv.ParseInt(cfg37.Gold_get, 10, 64) sumrate += onerate } } else { logger.Error("GetRedCatConfig failed lv=%v", v.Warelv+100) } } return sumrate } //发生金币变动时保存排行榜 func (udata *UserData) AddToRank() error { err := redishandler.GetRedisClient().Zadd(redis.USER_GOLD_RANK, float64(udata.Gold), strconv.Itoa(udata.UserId)) if err != nil { logger.Error("AddToRank failed err=%v", err) } return err } //计算最高等级猫的名字 func (u *UserData) CalcHigestCatName() string { higestlv := 0 for _, val := range u.PosInfo { if higestlv < val.Catlv { higestlv = val.Catlv } } //计算仓库内的 udatastr, err := redishandler.GetRedisClient().HGet(redis.USER_WAREHOUSE_INFO, strconv.Itoa(u.UserId)) if err != nil { logger.Error("CalcHigestCatName failed err=%v", err) return "" } wdata := new(UserWareHouseData) err = json.Unmarshal([]byte(udatastr), wdata) if err != nil { logger.Error("CalcHigestCatName Unmarshal redis failed ") return "" } for _, val := range wdata.Info { reallv := val.Warelv + 100 if higestlv < reallv { higestlv = reallv } } //计算猫名字 if higestlv > 100 { cfg := jsonconf.GetRedCatConfig(higestlv - 100) if cfg == nil { logger.Error("CalcHigestCatName failed getcfg higestlv=%v", higestlv) return "" } return cfg.Name } else { cfg := jsonconf.GetCatConfig(higestlv) if cfg == nil { logger.Error("CalcHigestCatName failed getcfg higestlv=%v", higestlv) return "" } return cfg.Name } }