三段竞赛

This commit is contained in:
hahwu 2024-12-04 16:36:49 +08:00
parent d3d7e44f2e
commit edfb3acea7
8 changed files with 145 additions and 30 deletions

View File

@ -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

View File

@ -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)
}

View File

@ -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

View File

@ -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 {

View File

@ -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
}

View File

@ -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
}

View File

@ -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)
}
}

View File

@ -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
}