限时事件优化,连击快手

This commit is contained in:
hahwu 2026-01-21 11:28:54 +08:00
parent dd6fdde8ce
commit edceb1cf1e
6 changed files with 49 additions and 26 deletions

View File

@ -1,6 +1,7 @@
package limitedTimeEventCfg package limitedTimeEventCfg
import ( import (
"math"
"server/game/mod/item" "server/game/mod/item"
GoUtil "server/game_util" GoUtil "server/game_util"
"server/gamedata" "server/gamedata"
@ -146,19 +147,33 @@ func GetSenceJackpotReward(Id int) []*item.Item {
} }
// 获取连击快手奖励 // 获取连击快手奖励
func GetFastProduceReward(Times, Energy int) []*item.Item { func GetFastProduceReward(Energy int) []*item.Item {
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_FAST) data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_FAST)
if err != nil { if err != nil {
log.Debug("GetSceneDashReward err:%v", err) log.Debug("GetSceneDashReward err:%v", err)
return nil return nil
} }
for _, v := range data { if len(data) == 0 {
if Times == gamedata.GetIntValue(v, "Times") && Energy <= gamedata.GetIntValue(v, "Max") && Energy >= gamedata.GetIntValue(v, "Min") {
return gamedata.GetItemList(v, "Items")
}
}
return nil return nil
} }
// Convert map to slice for sorting
type sortData struct {
Id string
Energy float64
}
sortedList := make([]sortData, 0)
energy := float64(Energy) / 10.0
for k, v := range data {
dataEnergy := gamedata.GetFloatValue(v, "EnergyValue")
sortedList = append(sortedList, sortData{k, math.Abs(energy - dataEnergy)})
}
// Sort by Energy in ascending order
sort.Slice(sortedList, func(i, j int) bool {
return sortedList[i].Energy < sortedList[j].Energy
})
return gamedata.GetItemList(data[sortedList[0].Id], "Items")
}
// 获取连击快手最大次数 // 获取连击快手最大次数
func GetFastProduceMaxTimes() int { func GetFastProduceMaxTimes() int {

View File

@ -581,7 +581,12 @@ func ReqGmCommand_(player *Player, Command string) error {
player.AddPlayroomUpvote(100100129) player.AddPlayroomUpvote(100100129)
i := player.GetPlayroomUpvote(100100129) i := player.GetPlayroomUpvote(100100129)
log.Debug("debug upvote:%d", i) log.Debug("debug upvote:%d", i)
case "addLimitEvent":
Id, _ := strconv.Atoi(arg[1])
Cd, _ := strconv.Atoi(arg[2])
LimitedTimeEventMod := player.PlayMod.getLimitedTimeEventMod()
LimitedTimeEventMod.AddEvent(Id, Cd)
player.PushClientRes(LimitedTimeEventMod.BackData())
default: default:
return fmt.Errorf("Player %d ReqGmCommand:%v not found", player.M_DwUin, arg) return fmt.Errorf("Player %d ReqGmCommand:%v not found", player.M_DwUin, arg)
} }

View File

@ -316,24 +316,17 @@ func (l *LimitedTimeEventMod) GetSceneDashReward() (int, []*item.Item) {
} }
// 获取连击快手奖励 // 获取连击快手奖励
func (l *LimitedTimeEventMod) GetFastProduceReward(Energy int) ([]*item.Item, int64, int, error) { func (l *LimitedTimeEventMod) GetFastProduceReward(Energy int) ([]*item.Item, error) {
Event, ok := l.EventList[EVENT_TYPE_FAST_PRODUCE] Event, ok := l.EventList[EVENT_TYPE_FAST_PRODUCE]
if !ok { if !ok {
return nil, 0, 0, fmt.Errorf("FastProduce event not exist") return nil, fmt.Errorf("FastProduce event not exist")
} }
Now := GoUtil.Now() Now := GoUtil.Now()
if Now < GoUtil.Int64(Event.Info["NextPlay"]) { if Now < GoUtil.Int64(Event.Info["NextPlay"]) {
return nil, 0, 0, fmt.Errorf("FastProduce CD") return nil, fmt.Errorf("FastProduce CD")
} }
Times := GoUtil.Int(Event.Info["Times"]) return limitedTimeEventCfg.GetFastProduceReward(Energy), nil
Times++
Event.Info["Times"] = Times
MaxTimes := limitedTimeEventCfg.GetFastProduceMaxTimes()
Times = min(Times, MaxTimes)
CD := limitedTimeEventCfg.GetFastCD()
Event.Info["NextPlay"] = GoUtil.Now() + int64(CD) // CD5分钟
return limitedTimeEventCfg.GetFastProduceReward(Times, Energy), GoUtil.Now() + int64(CD), Event.Info["Times"].(int), nil
} }
func (l *LimitedTimeEventMod) ResetFastProduceCD() { func (l *LimitedTimeEventMod) ResetFastProduceCD() {

View File

@ -1710,7 +1710,7 @@ func ReqFastProduceReward(player *Player, buf []byte) error {
return err return err
} }
LimitedTimeEventMod := player.PlayMod.getLimitedTimeEventMod() LimitedTimeEventMod := player.PlayMod.getLimitedTimeEventMod()
itemList, EndTime, Times, err := LimitedTimeEventMod.GetFastProduceReward(int(req.Energy)) itemList, err := LimitedTimeEventMod.GetFastProduceReward(int(req.Energy))
if err != nil { if err != nil {
player.SendErrClienRes(&msg.ResFastProduceReward{ player.SendErrClienRes(&msg.ResFastProduceReward{
Code: msg.RES_CODE_FAIL, Code: msg.RES_CODE_FAIL,
@ -1730,14 +1730,10 @@ func ReqFastProduceReward(player *Player, buf []byte) error {
player.TeLog("ReqFastProduceReward", map[string]interface{}{ player.TeLog("ReqFastProduceReward", map[string]interface{}{
"energy": int(req.Energy), "energy": int(req.Energy),
"item_list": itemList, "item_list": itemList,
"end_time": EndTime,
"times": Times,
}) })
player.PushClientRes(LimitedTimeEventMod.BackData()) player.PushClientRes(LimitedTimeEventMod.BackData())
player.PushClientRes(&msg.ResFastProduceReward{ player.PushClientRes(&msg.ResFastProduceReward{
Code: msg.RES_CODE_SUCCESS, Code: msg.RES_CODE_SUCCESS,
EndTime: EndTime,
Num: int32(Times),
}) })
return nil return nil
} }

View File

@ -185,9 +185,9 @@ func UnitLimitProgress(p *Player) error {
func UnitLimitedTimeEvent(p *Player) error { func UnitLimitedTimeEvent(p *Player) error {
LimitedTimeEventMod := p.PlayMod.getLimitedTimeEventMod() LimitedTimeEventMod := p.PlayMod.getLimitedTimeEventMod()
ChessMod := p.PlayMod.getChessMod()
mergeList := []int{246, 15} mergeList := []int{246, 15}
AddItem := LimitedTimeEventMod.GetChestReward(mergeList) AddItem := LimitedTimeEventMod.GetChestReward(mergeList, ChessMod.GetStarEmitList())
fmt.Print(AddItem) fmt.Print(AddItem)
return nil return nil
} }

View File

@ -2,6 +2,7 @@ package test
import ( import (
"server/game" "server/game"
limitedTimeEvent "server/game/mod/limited_time_event"
"testing" "testing"
) )
@ -14,3 +15,16 @@ func TestMetroRain(t *testing.T) {
rewards := LimitEventMod.GetMeteorReward([]int{1, 22, 3}, ChessMod.GetStarEmitList()) rewards := LimitEventMod.GetMeteorReward([]int{1, 22, 3}, ChessMod.GetStarEmitList())
t.Logf("rewards: %v", rewards) t.Logf("rewards: %v", rewards)
} }
func TestFast(t *testing.T) {
p := new(game.Player)
p.InitPlayer("3625212")
LimitEventMod := p.GetLimitEventMod()
LimitEventMod.AddEvent(limitedTimeEvent.EVENT_TYPE_FAST_PRODUCE, 60)
items, err := LimitEventMod.GetFastProduceReward(50)
if err != nil {
t.Errorf("GetFastProduceReward error: %v", err)
return
}
t.Logf("Fast produce items: %v", items)
}