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]
#host = ""
host = "192.168.110.53"
#host = "192.168.3.101"
#host = "192.168.110.53"
host = "192.168.3.102"
port = 3999
[auth]

4
internal/game/table.go

@ -198,14 +198,14 @@ func (t *Table) RemovePlayer(playerId int64) (found bool, player *Player) {
if p.Id == playerId {
t.Players[i] = nil
// 该玩家是房主, 房主给到下个位置玩家
if t.MasterId == player.Id {
if t.MasterId == p.Id {
nextMasterPos := t.NextPlayerPos(i)
if nextMasterPos != i {
t.MasterId = t.Players[nextMasterPos].Id
} else {
// 没有玩家了, 解散牌桌
t.Stage = 9
LobbyTables.Delete(player.GameTable.TableNo)
LobbyTables.Delete(p.GameTable.TableNo)
}
}
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 (
"fmt"
gameDelayer "texas-poker-bk/internal/game/delayer"
"texas-poker-bk/internal/logic/delayer"
"texas-poker-bk/internal/logic/store"
"texas-poker-bk/tool/collect"
"texas-poker-bk/tool/watcher"
"time"
)
@ -26,37 +24,6 @@ func handleOffline(e *watcher.Event[int64, bool]) {
return
}
fmt.Printf("account %d, %s handle offline.\n", account.Id, account.UserName)
if account == nil || store.NetAccounts.Get(account.Id) == nil {
return
}
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)
})
}
// 10s内未重连上处理离线逻辑
account.OfflineDelayCanceler = delayer.OfflineDelayer.Delay(10*time.Second, account.Id)
}

4
internal/logic/event/online.go

@ -19,8 +19,8 @@ func handleOnline(e *watcher.Event[int64, bool]) {
if account == nil {
return
}
if account.OfflineCleanCanceler != nil {
account.OfflineCleanCanceler.Cancel()
if account.OfflineDelayCanceler != nil {
account.OfflineDelayCanceler.Cancel()
}
if account.Player == nil {
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()
// 被踢玩家消息
player.Client.Write(&api.ResKickOutTable{})
p.Client.Write(&api.ResKickOutTable{})
}
// 通知牌桌所有玩家
player.GameTable.NoticeGameFullStatus()

2
internal/session/net_account.go

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

Loading…
Cancel
Save