三段竞赛
This commit is contained in:
parent
d3d7e44f2e
commit
edfb3acea7
@ -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
|
||||
|
||||
@ -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)
|
||||
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user