Browse Source

bugfix

master
tangmingyou 3 years ago
parent
commit
40110c8c88
  1. 4
      data/config.toml
  2. 4
      internal/game/table.go
  3. 65
      internal/logic/delayer/offline.go
  4. 25
      internal/logic/delayer/offline_clean.go
  5. 37
      internal/logic/event/offline.go
  6. 4
      internal/logic/event/online.go
  7. 2
      internal/logic/table.go
  8. 2
      internal/session/net_account.go

4
data/config.toml

@ -1,8 +1,8 @@
[http] [http]
#host = "" #host = ""
host = "192.168.110.53" #host = "192.168.110.53"
#host = "192.168.3.101" host = "192.168.3.102"
port = 3999 port = 3999
[auth] [auth]

4
internal/game/table.go

@ -198,14 +198,14 @@ func (t *Table) RemovePlayer(playerId int64) (found bool, player *Player) {
if p.Id == playerId { if p.Id == playerId {
t.Players[i] = nil t.Players[i] = nil
// 该玩家是房主, 房主给到下个位置玩家 // 该玩家是房主, 房主给到下个位置玩家
if t.MasterId == player.Id { if t.MasterId == p.Id {
nextMasterPos := t.NextPlayerPos(i) nextMasterPos := t.NextPlayerPos(i)
if nextMasterPos != i { if nextMasterPos != i {
t.MasterId = t.Players[nextMasterPos].Id t.MasterId = t.Players[nextMasterPos].Id
} else { } else {
// 没有玩家了, 解散牌桌 // 没有玩家了, 解散牌桌
t.Stage = 9 t.Stage = 9
LobbyTables.Delete(player.GameTable.TableNo) LobbyTables.Delete(p.GameTable.TableNo)
} }
} }
return true, p return true, p

65
internal/logic/delayer/offline.go

@ -0,0 +1,65 @@
package delayer
import (
"texas-poker-bk/internal/game/delayer"
"texas-poker-bk/internal/logic/store"
"texas-poker-bk/tool/async"
"texas-poker-bk/tool/collect"
"time"
)
// 清理离线用户
var (
OfflineDelayer *async.DelayQueue[int64]
)
func init() {
OfflineDelayer = async.NewDelayQueue(time.Second, 128, handleOfflineDelay)
}
func handleOfflineDelay(accountId int64, now time.Time) {
account := store.NetAccounts.Get(accountId)
if account == nil {
return
}
if account.Player == nil {
// 不在游戏中,移除
removeMemoryAccount(accountId)
return
}
// 牌局未在进行中直接移除玩家并下线
if collect.In(account.Player.GameTable.Stage, 1, 9) {
found, _ := account.Player.GameTable.RemovePlayer(account.Id)
if found {
account.SettlePlayerChip()
}
removeMemoryAccount(accountId)
return
}
// 牌局结束展示时间,10s后再移除玩家
if account.Player.GameTable.Stage == 7 {
accountId := accountId
delayer.GameDelayer.Delay(10*time.Second, func() {
account := store.NetAccounts.Get(accountId)
if account == nil || account.Player == nil || collect.NotIn(account.Player.GameTable.Stage, 1, 7, 9) {
return
}
// 从牌桌移除玩家
found, _ := account.Player.GameTable.RemovePlayer(account.Id)
if found {
account.SettlePlayerChip()
}
removeMemoryAccount(account.Id)
})
}
// 牌局进行中,自动下注待结束自动处理
}
// func removeMemoryAccount(account *session.NetAccount) {
func removeMemoryAccount(accountId int64) {
_ = store.NetAccounts.Get(accountId)
store.NetAccounts.Delete(accountId)
store.TokenVersions.Delete(accountId)
// TODO 持久化账户金额
}

25
internal/logic/delayer/offline_clean.go

@ -1,25 +0,0 @@
package delayer
import (
"texas-poker-bk/internal/logic/store"
"texas-poker-bk/tool/async"
"time"
)
// 清理离线用户
var (
OfflineCleanDelayer *async.DelayQueue[int64]
)
func init() {
OfflineCleanDelayer = async.NewDelayQueue(time.Second, 128, removeMemoryAccount)
}
// func removeMemoryAccount(account *session.NetAccount) {
func removeMemoryAccount(accountId int64, now time.Time) {
_ = store.NetAccounts.Get(accountId)
store.NetAccounts.Delete(accountId)
store.TokenVersions.Delete(accountId)
// TODO 持久化账户金额
}

37
internal/logic/event/offline.go

@ -2,10 +2,8 @@ package event
import ( import (
"fmt" "fmt"
gameDelayer "texas-poker-bk/internal/game/delayer"
"texas-poker-bk/internal/logic/delayer" "texas-poker-bk/internal/logic/delayer"
"texas-poker-bk/internal/logic/store" "texas-poker-bk/internal/logic/store"
"texas-poker-bk/tool/collect"
"texas-poker-bk/tool/watcher" "texas-poker-bk/tool/watcher"
"time" "time"
) )
@ -26,37 +24,6 @@ func handleOffline(e *watcher.Event[int64, bool]) {
return return
} }
fmt.Printf("account %d, %s handle offline.\n", account.Id, account.UserName) fmt.Printf("account %d, %s handle offline.\n", account.Id, account.UserName)
if account == nil || store.NetAccounts.Get(account.Id) == nil { // 10s内未重连上处理离线逻辑
return account.OfflineDelayCanceler = delayer.OfflineDelayer.Delay(10*time.Second, account.Id)
}
if account.Player == nil {
// 不在游戏中,n秒后移除
account.OfflineCleanCanceler = delayer.OfflineCleanDelayer.Delay(10*time.Second, account.Id)
return
}
// 牌局未在进行中直接移除玩家并下线
if collect.In(account.Player.GameTable.Stage, 1, 9) {
found, _ := account.Player.GameTable.RemovePlayer(account.Id)
if found {
account.SettlePlayerChip()
}
account.OfflineCleanCanceler = delayer.OfflineCleanDelayer.Delay(10*time.Second, account.Id)
return
}
// 牌局结束展示时间,10s后再移除玩家
if account.Player.GameTable.Stage == 7 {
accountId := e.Publisher
gameDelayer.GameDelayer.Delay(10*time.Second, func() {
account := store.NetAccounts.Get(accountId)
if account == nil || account.Player == nil || collect.NotIn(account.Player.GameTable.Stage, 1, 7, 9) {
return
}
// 从牌桌移除玩家
found, _ := account.Player.GameTable.RemovePlayer(account.Id)
if found {
account.SettlePlayerChip()
}
account.OfflineCleanCanceler = delayer.OfflineCleanDelayer.Delay(3*time.Second, account.Id)
})
}
} }

4
internal/logic/event/online.go

@ -19,8 +19,8 @@ func handleOnline(e *watcher.Event[int64, bool]) {
if account == nil { if account == nil {
return return
} }
if account.OfflineCleanCanceler != nil { if account.OfflineDelayCanceler != nil {
account.OfflineCleanCanceler.Cancel() account.OfflineDelayCanceler.Cancel()
} }
if account.Player == nil { if account.Player == nil {
return return

2
internal/logic/table.go

@ -221,7 +221,7 @@ func HandleReqKickOutTable(player *game.Player, msg *api.ReqKickOutTable) (proto
// 结算玩家金额 // 结算玩家金额
store.NetAccounts.Get(p.Id).SettlePlayerChip() store.NetAccounts.Get(p.Id).SettlePlayerChip()
// 被踢玩家消息 // 被踢玩家消息
player.Client.Write(&api.ResKickOutTable{}) p.Client.Write(&api.ResKickOutTable{})
} }
// 通知牌桌所有玩家 // 通知牌桌所有玩家
player.GameTable.NoticeGameFullStatus() player.GameTable.NoticeGameFullStatus()

2
internal/session/net_account.go

@ -17,7 +17,7 @@ type NetAccount struct {
BalanceLock *sync.RWMutex BalanceLock *sync.RWMutex
Lock *sync.Mutex Lock *sync.Mutex
OfflineCleanCanceler *async.Canceler[int64] OfflineDelayCanceler *async.Canceler[int64]
} }
func (account *NetAccount) DecrementBalance(amount int32) int32 { func (account *NetAccount) DecrementBalance(amount int32) int32 {

Loading…
Cancel
Save