game_sync/worldsrv/action_nian.go

591 lines
17 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package main
import (
"math/rand"
"mongo.games.com/game/common"
"mongo.games.com/game/model"
"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 := PlatformMgrSingleton.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
}
pack := &activity.SCNianData{}
pack.BossHp = p.WelfData.NianData.BossHp
pack.BossMaxHp = BossMaxHp
// pack.ActivityStartTime = timestamp
//pack.ActivityEndTime = endTimestamp
pack.ActivityStartTime = 0
pack.ActivityEndTime = 0
pack.AwardTime = p.WelfData.NianData.SignAwardTime
pack.BuffCount = p.WelfData.NianData.BuffCount
pack.BuffStatus = p.WelfData.NianData.BuffStatus
pack.LuckData = nil
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 := PlatformMgrSingleton.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
}
//本次攻击总血量
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
if randomValue >= LuckyRankNeed {
//更新幸运榜
}
}
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
if p.WelfData.NianData.AttackSumHp >= RankNeed {
//更新总榜
}
//更新伤害总榜
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,
})
}
}
}
}
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)
}
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 := PlatformMgrSingleton.GetConfig(p.Platform).ActivityNianConfig
if pool == nil || pool.List == nil {
return nil
}
if pool.Switch == model.WelfareClose {
logger.Logger.Trace("CSNianSignAward 活动关闭!")
return nil
}
//判断领取时间
if time.Now().Hour() >= int(pool.List[0].BuffStartTime) && time.Now().Hour() <= int(pool.List[0].BuffEndTime) {
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 := PlatformMgrSingleton.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)
}
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)
}