diff --git a/src/server/game/ActivityFunc.go b/src/server/game/ActivityFunc.go index 45363609..c6546911 100644 --- a/src/server/game/ActivityFunc.go +++ b/src/server/game/ActivityFunc.go @@ -2,7 +2,9 @@ package game import ( "server/GoUtil" + guesscolorCfg "server/conf/guessColor" miningCfg "server/conf/mining" + raceCfg "server/conf/race" "server/game/mod/item" "server/msg" ) @@ -153,16 +155,24 @@ func GetActivityItem(p *Player, ActType []int) []*item.Item { Items := make([]*item.Item, 0) for _, v := range ActType { Status := GetActivityStatus(p, v) + ActivityInfo := GetActivityInfo(p, v) + if ActivityInfo == nil { + continue + } if Status != ACT_STATUS_START { continue } switch v { case ACT_TYPE_MINING: - Item := miningCfg.GetLoseItem(v) + Item := miningCfg.GetLoseItem(ActivityInfo.Id) Items = item.Merge(Items, Item) case ACT_TYPE_GUESS_COLOR: - Item := miningCfg.GetLoseItem(v) + Item := guesscolorCfg.GetLoseItem(ActivityInfo.Id) Items = item.Merge(Items, Item) + case ACT_TYPE_RACE: + ItemId := raceCfg.GetCoin(ActivityInfo.Id) + Item := item.NewItem(ItemId, 1) + Items = append(Items, Item) } } return Items diff --git a/src/server/game/GameLogic.go b/src/server/game/GameLogic.go index 8c1de254..deaf9b57 100644 --- a/src/server/game/GameLogic.go +++ b/src/server/game/GameLogic.go @@ -498,18 +498,14 @@ func (ad *GameLogic) ClearData(args []interface{}) { if player != nil && player.M_DwUin != 0 { player.agent = nil log.Debug("player %d 断开连接", player.M_DwUin) - go func() { - time.Sleep(300 * time.Second) - if player != nil { - player.lock.Lock() - defer player.lock.Unlock() - if player.agent == nil { - player.ClearData() - ad.DelPlayer(player) - log.Debug("player %d 延迟300s关闭", player.M_DwUin) - } + player.CallEvent(300*time.Second, func() { + player.lock.Lock() + defer player.lock.Unlock() + if player.agent == nil { + player.ClearData() + log.Debug("player %d 延迟300s关闭", player.M_DwUin) } - }() + }, "LateClose") } } @@ -582,9 +578,20 @@ func (ad *GameLogic) NewPlayerConnect(args []interface{}) { internal.AsignPlayerToAgents(a, ad.NotInitPlayer) } -func (ad *GameLogic) ReplaceExistPlayerAndAgent(a gate.Agent, player *Player) { +func (ad *GameLogic) ReplaceExistPlayerAndAgent(a gate.Agent, player *Player) error { + if player == nil { + return fmt.Errorf("player is nil") + } + player.lock.Lock() + defer player.lock.Unlock() + storePlayer := ad.GetPlayer(player.M_DwUin) + if storePlayer == nil { + return fmt.Errorf("player is delete") + } + if player.stop { + return fmt.Errorf("player is stop") + } agent := player.GetAgentByPlayer() - notify := &msg.ForceKickOut{} data, _ := proto.Marshal(notify) if agent != nil && a != agent { @@ -597,7 +604,14 @@ func (ad *GameLogic) ReplaceExistPlayerAndAgent(a gate.Agent, player *Player) { ResultCode: 0, DwUin: player.M_DwUin, }) + // 取消延迟关闭 + Timer, ok := player.timerList["LateClose"] + if ok { + Timer.Stop() + } player.LoginBackData() + log.Debug("player %d 重连", player.M_DwUin) + return nil } func (ad *GameLogic) SendMassage(dwUin int32, Func string, data []byte) bool { @@ -784,6 +798,10 @@ func (ad *GameLogic) RegisterNetWorkFunc() { RegisterMsgProcessFunc("ReqGuessColor", ReqGuessColor) // 请求猜颜色数据 RegisterMsgProcessFunc("ReqGuessColorReward", ReqGuessColorReward) // 领取猜颜色奖励 RegisterMsgProcessFunc("ReqGuessColorTake", ReqGuessColorTake) // 猜颜色 + // 三段竞赛 + RegisterMsgProcessFunc("ReqRace", ReqRace) + RegisterMsgProcessFunc("ReqRaceReward", ReqRaceReward) + RegisterMsgProcessFunc("ReqRaceStart", ReqRaceStart) } diff --git a/src/server/game/Gm.go b/src/server/game/Gm.go index 4e43600e..54cecea9 100644 --- a/src/server/game/Gm.go +++ b/src/server/game/Gm.go @@ -135,6 +135,11 @@ func ReqGmCommand(args []interface{}) error { ActivityInfo := GetActivityInfo(player, ACT_TYPE_GUESS_COLOR) GuessColorMod.ZeroUpdate(ActivityInfo.Id) GuessColorBackData(player) + case "raceReload": + RaceMod := player.PlayMod.getRaceMod() + RaceMod.ZeroUpdate(-1) + ActivityInfo := GetActivityInfo(player, ACT_TYPE_RACE) + RaceMod.ZeroUpdate(ActivityInfo.Id) } player.PlayMod.save() return nil diff --git a/src/server/game/Player.go b/src/server/game/Player.go index 026a79b3..39fa7e96 100644 --- a/src/server/game/Player.go +++ b/src/server/game/Player.go @@ -88,7 +88,6 @@ func (p *Player) Stop() { } func (p *Player) CallEvent(Duration time.Duration, F func(), Label string) { - log.Debug("CallEvent:%s", Label) if v, ok := p.timerList[Label]; ok { v.Stop() } @@ -349,9 +348,8 @@ func (p *Player) Login() { // 离线 保存数据 func (p *Player) ClearData() { - p.lock.Lock() - defer p.lock.Unlock() - log.Release("uid: %d, ClearData", p.M_DwUin) + + log.Release("uid: %d, outline save data", p.M_DwUin) ctx := context.Background() txOptions := &sql.TxOptions{} tx, err := db.SqlDb.BeginTx(ctx, txOptions) @@ -368,6 +366,7 @@ func (p *Player) ClearData() { tx.Commit() GoUtil.RemoveEvent(MergeConst.Notify_Daily_Renew, p.ZeroUpdate, p) p.Stop() + G_GameLogicPtr.DelPlayer(p) } func (p *Player) AutoSaveData() { @@ -611,6 +610,9 @@ func (p *Player) HandleItem(itemList []*item.Item, Label string) error { "avatar_id": Effect[0], "income_from": Label, }) + case item.ITEM_TYPE_ACTIVITY_RACE: + RaceMod := p.PlayMod.getRaceMod() + RaceMod.AddCoin(v.Num) default: err := ItemMod.AddItem(v.Id, v.Num) if err != nil { diff --git a/src/server/game/PlayerBaseMod.go b/src/server/game/PlayerBaseMod.go index 8607927c..4930c957 100644 --- a/src/server/game/PlayerBaseMod.go +++ b/src/server/game/PlayerBaseMod.go @@ -6,7 +6,6 @@ import ( "database/sql" "encoding/gob" "errors" - "fmt" "server/GoUtil" "server/MergeConst" userCfg "server/conf/user" @@ -578,7 +577,6 @@ func (p *PlayerBaseData) ClearData() bool { p.MTicker.Stop() p.MTicker = nil } - fmt.Print("ClearData:", p.Data.DwUin) p.SaveDataFromDB("") return true } diff --git a/src/server/game/RegisterNetworkFunc.go b/src/server/game/RegisterNetworkFunc.go index b776f9ec..30bddc1d 100644 --- a/src/server/game/RegisterNetworkFunc.go +++ b/src/server/game/RegisterNetworkFunc.go @@ -2570,3 +2570,60 @@ func ReqGuessColorReward(args []interface{}) error { GuessColorBackData(player) return nil } + +// 请求竞赛基础数据 +func ReqRace(args []interface{}) error { + _, player, _ := ParseArgs(args) + RaceBackData(player) + return nil +} + +// 请求竞赛开始 +func ReqRaceStart(args []interface{}) error { + _, player, buf := ParseArgs(args) + req := &msg.ReqRaceStart{} + proto.Unmarshal(buf, req) + RaceMod := player.PlayMod.getRaceMod() + err := RaceMod.StartGame() + if err != nil { + player.SendErrClienRes(&msg.ResRaceStart{ + Code: msg.RES_CODE_FAIL, + Msg: err.Error(), + }) + return err + } + RaceBackData(player) + player.PushClientRes(&msg.ResRaceStart{ + Code: msg.RES_CODE_SUCCESS, + }) + return nil +} + +// 领取竞赛奖励 +func ReqRaceReward(args []interface{}) error { + _, player, buf := ParseArgs(args) + req := &msg.ResRaceReward{} + proto.Unmarshal(buf, req) + RaceMod := player.PlayMod.getRaceMod() + Items, err := RaceMod.GetReward() + if err != nil { + player.SendErrClienRes(&msg.ResRaceReward{ + Code: msg.RES_CODE_FAIL, + Msg: err.Error(), + }) + return err + } + err = player.HandleItem(Items, "RaceReward") + if err != nil { + player.SendErrClienRes(&msg.ResRaceReward{ + Code: msg.RES_CODE_FAIL, + Msg: err.Error(), + }) + return err + } + RaceBackData(player) + player.PushClientRes(&msg.ResRaceReward{ + Code: msg.RES_CODE_SUCCESS, + }) + return nil +} diff --git a/src/server/game/external.go b/src/server/game/external.go index 24b0ef09..46df7177 100644 --- a/src/server/game/external.go +++ b/src/server/game/external.go @@ -119,9 +119,8 @@ func HandleClientReq(args []interface{}) { } if ResLogin.DwUin > 0 { OldPlayer := G_GameLogicPtr.GetPlayer(ResLogin.DwUin) - if OldPlayer != nil { - G_GameLogicPtr.ReplaceExistPlayerAndAgent(a, OldPlayer) - } else { + err := G_GameLogicPtr.ReplaceExistPlayerAndAgent(a, OldPlayer) + if err != nil { G_GameLogicPtr.CreateNewPlayer(a, detail.UserName) } } diff --git a/src/server/game/mod/race/race.go b/src/server/game/mod/race/race.go index 83d60879..a9d80807 100644 --- a/src/server/game/mod/race/race.go +++ b/src/server/game/mod/race/race.go @@ -33,26 +33,43 @@ func (r *RaceMod) Login(Id int) { } r.Id = Id r.Pass = 1 + r.StartTime = 0 + r.EndTime = 0 + r.Progress = 0 + r.Rank = 0 + r.Opponent = nil } -func (r *RaceMod) StartGame() { +func (r *RaceMod) ZeroUpdate(Id int) { + r.Login(Id) +} + +func (r *RaceMod) StartGame() error { + if r.StartTime != 0 { + return fmt.Errorf("the game has started") + } MaxPass := raceCfg.GetMaxPass(r.Id) - if r.Rank != 1 || r.Pass == MaxPass { + if r.Rank != 1 || r.Pass > MaxPass { r.Pass = 1 } + r.Rank = 0 r.StartTime = GoUtil.Now() Opponent := make([]*Opponent, 0) OpponentNum := raceCfg.GetRaceNum(r.Pass) - for i := 1; i <= OpponentNum; i++ { + for i := 1; i < OpponentNum; i++ { Opponent = append(Opponent, randOpponent(i)) } r.Opponent = Opponent + return nil } -func (r *RaceMod) AddCoin() { - r.Progress++ +func (r *RaceMod) AddCoin(Num int) { + if r.StartTime == 0 { + return + } + r.Progress += Num Need := raceCfg.GetRaceNeed(r.Pass) - if r.Progress == Need { + if r.Progress >= Need && r.Rank == 0 { r.EndTime = GoUtil.Now() Rank := 1 for _, v := range r.Opponent { @@ -83,6 +100,15 @@ func (r *RaceMod) GetReward() ([]*item.Item, error) { ExtraReward := raceCfg.GetExtraReward(r.Id) Items = append(Items, ExtraReward...) } + r.Pass++ + MaxPass := raceCfg.GetMaxPass(r.Id) + if r.Pass > MaxPass { + r.Pass = 1 + } + r.StartTime = 0 + r.EndTime = 0 + r.Progress = 0 + r.Opponent = nil return Items, nil }