package main import ( "math/rand" "mongo.games.com/game/common" "mongo.games.com/game/model" "mongo.games.com/game/mq" "mongo.games.com/game/protocol/activity" "mongo.games.com/game/srvdata" "mongo.games.com/goserver/core/logger" "mongo.games.com/goserver/core/netlib" "strconv" "strings" "time" ) // 请求年兽信息 func CSNianData(s *netlib.Session, packetid int, data interface{}, sid int64) error { if _, ok := data.(*activity.CSNianData); ok { p := PlayerMgrSington.GetOnlinePlayer(sid) sData := srvdata.PBDB_NewYearActivityMgr.Datas.GetArr() BossMaxHp := int64(0) for _, value := range sData { if value.Id == 5 { BossMaxHp, _ = strconv.ParseInt(value.PropValue, 10, 64) break } } logger.Logger.Trace("请求年兽信息!snid = ", p.SnId) if p == nil { logger.Logger.Warn("CSNianData p == nil") return nil } pool := WelfareMgrSington.GetConfig(p.Platform).ActivityNianConfig if pool == nil || pool.List == nil || pool.Switch == model.WelfareClose { return nil } startTime := pool.List[0].ActivityStart endTime := pool.List[0].ActivityEnd start, _ := time.Parse(time.DateTime, startTime) // 转换为时间戳(以秒为单位) timestamp := start.Unix() end, _ := time.Parse(time.DateTime, endTime) endTimestamp := end.Unix() if p.WelfData.NianData != nil && (p.WelfData.NianData.ActivityStartTime != timestamp || p.WelfData.NianData.ActivityEndTime != endTimestamp) { logger.Logger.Infof("CSNianData 年兽活动时间变更 清除之前数据 snid= %d", p.SnId) WelfareMgrSington.ClearActivityNianData(p) } if p.WelfData.NianData == nil { p.WelfData.NianData = &model.NianData{ ActivityStartTime: timestamp, ActivityEndTime: endTimestamp, } } if p.WelfData.NianData.BossHp == 0 { p.WelfData.NianData.BossHp = BossMaxHp } //排行榜配置 rankData := PlatformMgrSingleton.GetConfig(p.Platform).NianRankReward if rankData == nil { return nil } pack := &activity.SCNianData{} for _, info := range rankData.RankData { rankInfo := &activity.NianRankData{} rankInfo.TypeId = info.TypeId for _, awardInfo := range info.RankInfo { rank := &activity.NianRankInfo{} rank.RankId = awardInfo.RankId for _, itemInfo := range awardInfo.Award { rankAwardData := &activity.RankAwardData{ ItemId: itemInfo.ItemId, ItemNum: itemInfo.ItemNum, } rank.Award = append(rank.Award, rankAwardData) } rankInfo.Data = append(rankInfo.Data, rank) } pack.RankData = append(pack.RankData, rankInfo) } var intSlice []int var shopNum []int for _, value := range sData { if value.Id == 17 { str := value.PropValue strSlice := strings.Split(str, ",") // 转换每个字符串为 int for _, s := range strSlice { num, _ := strconv.Atoi(s) intSlice = append(intSlice, num) } break } if value.Id == 18 { str := value.PropValue strSlice := strings.Split(str, ",") // 转换每个字符串为 int for _, s := range strSlice { num, _ := strconv.Atoi(s) shopNum = append(shopNum, num) } break } } for pos, shopId := range intSlice { num := shopNum[pos] if num == 0 { continue } shopInfo := &activity.ShopData{} shopInfo.ShopId = int32(shopId) shopInfo.ShopNum = p.WelfData.NianData.GiftShop[int32(shopId)] shopInfo.MaxShopNum = int32(num) pack.ShopData = append(pack.ShopData, shopInfo) } StartTs := common.IntToTime(int(pool.List[0].BuffStartTime)).Unix() EndTs := common.IntToTime(int(pool.List[0].BuffEndTime)).Unix() pack.BuffStartTime = StartTs pack.BuffEndTime = EndTs pack.BossHp = p.WelfData.NianData.BossHp pack.BossMaxHp = BossMaxHp pack.ActivityStartTime = timestamp pack.ActivityEndTime = endTimestamp pack.AwardTime = p.WelfData.NianData.SignAwardTime pack.BuffCount = p.WelfData.NianData.BuffCount pack.BuffStatus = p.WelfData.NianData.BuffStatus pack.SignAwardTime = p.WelfData.NianData.SignAwardTime logger.Logger.Trace("请求年兽活动信息 ", pack) p.SendToClient(int(activity.NianPacketID_PACKET_SCNianData), pack) } return nil } // 攻击年兽 func CSNianAttack(s *netlib.Session, packetid int, data interface{}, sid int64) error { if msg, ok := data.(*activity.CSNianAttack); ok { typeId := msg.TypeId p := PlayerMgrSington.GetOnlinePlayer(sid) sData := srvdata.PBDB_NewYearActivityMgr.Datas.GetArr() BossMaxHp := int64(0) for _, value := range sData { if value.Id == 5 { BossMaxHp, _ = strconv.ParseInt(value.PropValue, 10, 64) break } } if p.WelfData.NianData == nil { p.WelfData.NianData = &model.NianData{} } if p.WelfData.NianData.BossHp <= 0 { p.WelfData.NianData.BossHp = BossMaxHp } logger.Logger.Trace("客户端请求攻击年兽!snid = ", p.SnId) if p == nil { logger.Logger.Warn("CSNianAttack p == nil") return nil } pool := WelfareMgrSington.GetConfig(p.Platform).ActivityNianConfig if pool == nil || pool.List == nil { return nil } if pool.Switch == model.WelfareClose { logger.Logger.Trace("CSNianAttack 活动关闭!") return nil } //判断活动时间 startTime := pool.List[0].ActivityStart endTime := pool.List[0].ActivityEnd t, _ := time.Parse(time.DateTime, startTime) // 转换为时间戳(以秒为单位) timestamp := t.Unix() end, _ := time.Parse(time.DateTime, endTime) endTimestamp := end.Unix() nowTime := time.Now().Unix() if nowTime < timestamp || nowTime > endTimestamp { return nil } pack := &activity.SCNianAttackData{} itemId := 0 itemNum := 1 count := 1 if typeId == 1 { itemId = common.ItemIDLittleGuaranteed } else if typeId == 2 { itemId = common.ItemIDLittleGuaranteed itemNum = 10 count = 10 } else if typeId == 3 { itemId = common.ItemIDBigGuaranteed } else { return nil } var items []*model.Item items = append(items, &model.Item{ ItemId: int32(itemId), ItemNum: int64(-itemNum), }) _, _, result := BagMgrSingleton.AddItems(&model.AddItemParam{ Platform: p.Platform, SnId: p.SnId, Change: items, GainWay: common.GainWayNianCost, Operator: "system", Remark: "年兽活动消耗", }) if !result { return nil } items = []*model.Item{} //本次攻击总血量 AttackHp := int64(0) LuckyRankNeed := int64(0) RankNeed := int64(0) for _, value := range sData { if value.Id == 7 { LuckyRankNeed, _ = strconv.ParseInt(value.PropValue, 10, 64) break } } for _, value := range sData { if value.Id == 8 { RankNeed, _ = strconv.ParseInt(value.PropValue, 10, 64) break } } //伤害范围 var intSlice []int if typeId == 1 || typeId == 2 { for _, value := range sData { if value.Id == 9 { str := value.PropValue strSlice := strings.Split(str, ",") // 转换每个字符串为 int for _, s := range strSlice { num, err := strconv.Atoi(s) if err != nil { return nil } intSlice = append(intSlice, num) } break } } } //保底奖励次数 floorCount := 0 for _, value := range sData { if typeId == 1 || typeId == 2 { if value.Id == 13 { floorCount, _ = strconv.Atoi(value.PropValue) break } } else { if value.Id == 15 { floorCount, _ = strconv.Atoi(value.PropValue) break } } } if typeId == 3 { for _, value := range sData { if value.Id == 10 { str := value.PropValue strSlice := strings.Split(str, ",") // 转换每个字符串为 int for _, s := range strSlice { num, err := strconv.Atoi(s) if err != nil { return nil } intSlice = append(intSlice, num) } break } } } awardInfo := &activity.RankAwardData{} for i := 0; i < count; i++ { //随机伤害值 randomValue := int64(rand.Intn(intSlice[1]-intSlice[0]+1) + intSlice[0]) logger.Logger.Tracef("随机到的伤害值是:%d", randomValue) //计算BUFF if p.WelfData.NianData.BuffCount > 0 { randomValue = randomValue + randomValue/2 p.WelfData.NianData.BuffCount -= 1 } if p.WelfData.NianData.AttackMaxHp < randomValue { p.WelfData.NianData.AttackMaxHp = randomValue } AttackHp += randomValue if typeId == 3 { p.WelfData.NianData.BigHurt += 1 //判断是否掉落保底奖励 if p.WelfData.NianData.BigHurt%int32(floorCount) == 0 { floorReward := &activity.RankAwardData{} for _, value := range sData { if value.Id == 16 { strSlice := strings.Split(value.PropValue, ",") FloorItemId, _ := strconv.Atoi(strSlice[0]) FloorItemNum, _ := strconv.Atoi(strSlice[1]) items = append(items, &model.Item{ ItemId: int32(FloorItemId), ItemNum: int64(FloorItemNum), }) floorReward.ItemId = int32(FloorItemId) floorReward.ItemNum = int64(FloorItemNum) pack.FloorReward = append(pack.FloorReward, floorReward) break } } } //额外掉落 extraItemId := 0 extraItemNum := 0 var intSlice1 []int for _, value := range sData { if value.Id == 11 { extraItemId, _ = strconv.Atoi(value.PropValue) break } } for _, value := range sData { if value.Id == 12 { str := value.PropValue strSlice := strings.Split(str, ",") // 转换每个字符串为 int for _, s := range strSlice { num, err := strconv.Atoi(s) if err != nil { return nil } intSlice1 = append(intSlice1, num) } break } } //随机个数 extraItemNum = rand.Intn(intSlice1[1]-intSlice1[0]+1) + intSlice1[0] items = append(items, &model.Item{ ItemId: int32(extraItemId), ItemNum: int64(extraItemNum), }) extraDrop := &activity.RankAwardData{} extraDrop.ItemId = int32(extraItemId) extraDrop.ItemNum = int64(extraItemNum) pack.ExtraDrop = append(pack.ExtraDrop, extraDrop) } else { p.WelfData.NianData.LittleHurt += 1 //判断是否掉落保底奖励 if p.WelfData.NianData.LittleHurt%int32(floorCount) == 0 { floorReward := &activity.RankAwardData{} for _, value := range sData { if value.Id == 14 { strSlice := strings.Split(value.PropValue, ",") FloorItemId, _ := strconv.Atoi(strSlice[0]) FloorItemNum, _ := strconv.Atoi(strSlice[1]) items = append(items, &model.Item{ ItemId: int32(FloorItemId), ItemNum: int64(FloorItemNum), }) floorReward.ItemId = int32(FloorItemId) floorReward.ItemNum = int64(FloorItemNum) pack.FloorReward = append(pack.FloorReward, floorReward) break } } } } } p.WelfData.NianData.BossHp -= AttackHp p.WelfData.NianData.AttackSumHp += AttackHp isDie := false //是否死亡 //判断Boss是否死亡 var bossDieAward []*model.Item if p.WelfData.NianData.BossHp <= 0 { isDie = true p.WelfData.NianData.BossHp = BossMaxHp p.WelfData.NianData.BossDieCount += 1 //获取死亡奖励 for _, value := range sData { if value.Id == 6 { str := value.PropValue strSlice := strings.Split(str, ";") for _, s := range strSlice { strSlice1 := strings.Split(s, ",") bossDieItemId, err := strconv.Atoi(strSlice1[0]) if err != nil { return nil } bossDieItemNum, err := strconv.ParseInt(strSlice1[1], 10, 64) if err != nil { return nil } bossDieAward = append(bossDieAward, &model.Item{ ItemId: int32(bossDieItemId), ItemNum: bossDieItemNum, }) items = append(items, &model.Item{ ItemId: int32(bossDieItemId), ItemNum: bossDieItemNum, }) } break } } //年兽死亡额外掉落 BigHurtCount := 0 for _, value := range sData { if value.Id == 19 { BigHurtCount, _ = strconv.Atoi(value.PropValue) break } } logger.Logger.Trace("年兽死亡额外掉落 当前已使用BigHurt :", p.WelfData.NianData.BigHurt, "BigHurtCount = ", BigHurtCount) if p.WelfData.NianData.BigHurt >= int32(BigHurtCount) { //后台配置额外掉落 for _, info := range pool.List[0].BossDieOtherReward { //value.BossDieOtherReward if p.WelfData.NianData.OtherAwardNum[info.Id] >= info.DropUp { logger.Logger.Trace("BOSS死亡 额外掉落达到上限 id = ", info.Id, "数量:", p.WelfData.NianData.OtherAwardNum[info.Id]) continue } //随机 if rand.Intn(100) < int(info.DropRate) { otherItemId := info.ItemId otherItemNum := info.ItemNum if int32(otherItemNum)+p.WelfData.NianData.OtherAwardNum[info.Id] > info.DropUp { otherItemNum = int64(info.DropUp - p.WelfData.NianData.OtherAwardNum[info.Id]) } p.WelfData.NianData.OtherAwardNum[info.Id] += int32(otherItemNum) items = append(items, &model.Item{ ItemId: otherItemId, ItemNum: otherItemNum, }) bossDieAward = append(bossDieAward, &model.Item{ ItemId: otherItemId, ItemNum: otherItemNum, }) } } } TaskSubjectSingleton.Touch(common.TaskTypeNianBossKill, &TaskData{SnId: p.SnId, Num: 1}) // BOSS死亡 } items = append(items, &model.Item{ ItemId: common.ItemIDCoin, ItemNum: AttackHp, }) BagMgrSingleton.AddItems(&model.AddItemParam{ Platform: p.Platform, SnId: p.SnId, Change: items, GainWay: common.GainWayNianGain, Operator: "system", Remark: "年兽活动-攻击年兽获得", }) awardInfo.ItemId = common.ItemIDCoin awardInfo.ItemNum = AttackHp pack.Award = append(pack.Award, awardInfo) pack.AttackHp = AttackHp pack.TypeId = typeId pack.BossHp = p.WelfData.NianData.BossHp pack.IsDie = isDie for _, item := range bossDieAward { dieInfo := &activity.RankAwardData{} dieInfo.ItemId = item.ItemId dieInfo.ItemNum = item.ItemNum pack.DieAward = append(pack.DieAward, dieInfo) } pack.BuffCount = p.WelfData.NianData.BuffCount p.SendToClient(int(activity.NianPacketID_PACKET_SCNianAttackData), pack) TaskSubjectSingleton.Touch(common.TaskTypeNianBossDamage, &TaskData{SnId: p.SnId, Num: AttackHp}) // 对年兽造成伤害 //更新年兽排行榜榜 luckValue := p.WelfData.NianData.AttackMaxHp luckTime := time.Now().Unix() if luckValue < LuckyRankNeed { luckValue = 0 luckTime = 0 } damage := p.WelfData.NianData.AttackSumHp if luckValue < RankNeed { damage = 0 } //if luckValue > 0 || damage > 0 { log := &model.NianInfo{ Platform: p.Platform, SnId: p.SnId, Name: p.Name, Luck: luckValue, Damage: damage, ModId: p.Roles.ModId, Ts: time.Now().Unix(), } if luckTime > 0 { log.LuckTime = luckTime } mq.Write(log) //} } return nil } // 请求领取BUFF func CSNianBuff(s *netlib.Session, packetid int, data interface{}, sid int64) error { if _, ok := data.(*activity.CSNianBuff); ok { p := PlayerMgrSington.GetOnlinePlayer(sid) //yearActivity := &server.DB_NewYearActivity{} logger.Logger.Trace("客户端请求请求领取BUFF snid = ", p.SnId) if p == nil { return nil } if p.WelfData.NianData == nil { p.WelfData.NianData = &model.NianData{} } if p.WelfData.NianData.BuffStatus { return nil } pool := WelfareMgrSington.GetConfig(p.Platform).ActivityNianConfig if pool == nil || pool.List == nil { return nil } if pool.Switch == model.WelfareClose { logger.Logger.Trace("CSNianSignAward 活动关闭!") return nil } StartTs := common.IntToTime(int(pool.List[0].BuffStartTime)).Unix() EndTs := common.IntToTime(int(pool.List[0].BuffEndTime)).Unix() //判断领取时间 if time.Now().Unix() >= StartTs && time.Now().Unix() <= EndTs { sData := srvdata.PBDB_NewYearActivityMgr.Datas.GetArr() count := int64(0) for _, value := range sData { if value.Id == 20 { count, _ = strconv.ParseInt(value.PropValue, 10, 64) break } } p.WelfData.NianData.BuffCount = count p.WelfData.NianData.BuffStatus = true pack := &activity.SCNianBuff{ BuffCount: p.WelfData.NianData.BuffCount, } p.SendToClient(int(activity.NianPacketID_PACKET_SCNianBuff), pack) } } return nil } // 领取签到奖励 func CSNianSignAward(s *netlib.Session, packetid int, data interface{}, sid int64) error { if _, ok := data.(*activity.CSNianBuff); ok { p := PlayerMgrSington.GetOnlinePlayer(sid) logger.Logger.Trace("客户端请求请求领取BUFF snid = ", p.SnId) if p == nil { return nil } pool := WelfareMgrSington.GetConfig(p.Platform).ActivityNianConfig if pool == nil || pool.List == nil { return nil } if pool.Switch == model.WelfareClose { logger.Logger.Trace("CSNianSignAward 活动关闭!") return nil } if p.WelfData.NianData == nil { p.WelfData.NianData = &model.NianData{} } if p.WelfData.NianData.SignAwardTime > 0 { return nil } p.WelfData.NianData.SignAwardTime = time.Now().Unix() //奖励 pack := &activity.SCNianSignAward{} pack.SignAwardTime = p.WelfData.NianData.SignAwardTime var items []*model.Item for _, info := range pool.List[0].SignReward { items = append(items, &model.Item{ ItemId: info.ItemId, ItemNum: info.ItemNum, }) award := &activity.RankAwardData{} award.ItemId = info.ItemId award.ItemNum = info.ItemNum pack.SignAward = append(pack.SignAward, award) } BagMgrSingleton.AddItems(&model.AddItemParam{ Platform: p.Platform, SnId: p.SnId, Change: items, GainWay: common.GainWayNianGain, Operator: "system", Remark: "年兽活动-领取签到奖励获得", }) p.SendToClient(int(activity.NianPacketID_PACKET_SCNianSignAward), pack) TaskSubjectSingleton.Touch(common.TaskTypeNianSign, &TaskData{SnId: p.SnId, Num: 1}) } return nil } func CSNianChange(s *netlib.Session, packetid int, data interface{}, sid int64) error { if msg, ok := data.(*activity.CSNianChange); ok { num := msg.Num if num <= 0 || num > 99 { return nil } p := PlayerMgrSington.GetOnlinePlayer(sid) logger.Logger.Trace("客户端请求请求年兽兑换 snid = ", p.SnId) if p == nil { return nil } sData := srvdata.PBDB_NewYearActivityMgr.Datas.GetArr() itemNum := 0 coin := 0 diamond := 0 for _, value := range sData { if value.Id == 21 { strSlice := strings.Split(value.PropValue, ",") diamond, _ = strconv.Atoi(strSlice[0]) itemNum, _ = strconv.Atoi(strSlice[1]) coin, _ = strconv.Atoi(strSlice[2]) break } } if p.Diamond < int64(diamond*int(num)) { return nil } p.AddDiamond(int64(-diamond*int(num)), 0, common.GainWayNianCost, "sys", "年兽活动兑换道具") var items []*model.Item items = append(items, &model.Item{ ItemId: common.ItemIDCoin, ItemNum: int64(coin * int(num)), }) items = append(items, &model.Item{ ItemId: common.ItemIDLittleGuaranteed, ItemNum: int64(itemNum * int(num)), }) BagMgrSingleton.AddItems(&model.AddItemParam{ Platform: p.Platform, SnId: p.SnId, Change: items, GainWay: common.GainWayNianGain, Operator: "system", Remark: "年兽活动-兑换", }) pack := &activity.SCNianChange{} pack.Num = num for _, item := range items { info := &activity.RankAwardData{ ItemId: item.ItemId, ItemNum: item.ItemNum, } pack.Award = append(pack.Award, info) } p.SendToClient(int(activity.NianPacketID_PACKET_SCNianChange), pack) } return nil } func init() { common.Register(int(activity.NianPacketID_PACKET_CSNianData), activity.CSNianData{}, CSNianData) common.Register(int(activity.NianPacketID_PACKET_CSNianAttack), activity.CSNianAttack{}, CSNianAttack) common.Register(int(activity.NianPacketID_PACKET_CSNianBuff), activity.CSNianBuff{}, CSNianBuff) common.Register(int(activity.NianPacketID_PACKET_CSNianSignAward), activity.CSNianSignAward{}, CSNianSignAward) common.Register(int(activity.NianPacketID_PACKET_CSNianChange), activity.CSNianChange{}, CSNianChange) }