修正严重BUG

This commit is contained in:
sk 2025-06-14 11:50:33 +08:00
parent 42912cdae6
commit 570f9a57fd
4 changed files with 73 additions and 43 deletions

View File

@ -1,7 +1,10 @@
package data
import (
"crypto/md5"
"fmt"
"github.com/oylshe1314/framework/server"
"github.com/oylshe1314/framework/util"
"os"
"reflect"
"strings"
@ -12,6 +15,8 @@ type tableLoader interface {
}
type Tables struct {
dataDir string
Copy CopyTable
CopyMain CopyMainTable
Equip EquipTable
@ -35,14 +40,28 @@ type Tables struct {
UpgradeMaster UpgradeMasterTable
}
func NewTables(dataDir string) (*Tables, error) {
var tables = new(Tables)
var tt = reflect.TypeOf(tables).Elem()
var tv = reflect.ValueOf(tables).Elem()
func NewTables(dataDir string) *Tables {
return &Tables{dataDir: dataDir}
}
func (this *Tables) Load() error {
allHash, _, err := util.HashAll(md5.New(), true, nil, []string{this.dataDir}, nil)
if err != nil {
return err
}
server.DataHash = allHash[0]
var tt = reflect.TypeOf(this).Elem()
var tv = reflect.ValueOf(this).Elem()
var fn = tt.NumField()
for i := range fn {
var sf = tt.Field(i)
if !sf.IsExported() {
continue
}
var ft = sf.Type
var name = ft.Name()
if strings.HasSuffix(name, "Table") {
@ -56,16 +75,16 @@ func NewTables(dataDir string) (*Tables, error) {
continue
}
buf, err := os.ReadFile(fmt.Sprintf("%s/tb%s.json", dataDir, strings.ToLower(name)))
buf, err := os.ReadFile(fmt.Sprintf("%s/tb%s.json", this.dataDir, strings.ToLower(name)))
if err != nil {
return nil, err
return err
}
err = loader.load(buf)
if err != nil {
return nil, err
return err
}
}
return tables, nil
return nil
}

View File

@ -174,6 +174,21 @@ func (this *PlayerManager) storeChanges(player *Player) {
}
}
func (this *PlayerManager) tick(player *Player, now, elapsed int64) int64 {
player.lock() // lock
defer player.unlock()
this.clearChanges(player)
var b = util.UnixMilli()
player.tick(now, elapsed)
var e = util.UnixMilli()
this.storeChanges(player)
return e - b
}
func (this *PlayerManager) run(player *Player) {
go func(player *Player) {
this.waitGroup.Add(1)
@ -183,32 +198,22 @@ func (this *PlayerManager) run(player *Player) {
this.waitGroup.Done()
}()
var b, e int64
var elapsed int64 = 0
var spend int64
var elapsed int64
for {
now := <-ticker.C
elapsed++
player.lock() // lock
this.clearChanges(player)
b = util.UnixMilli()
player.tick(now.Unix(), elapsed)
e = util.UnixMilli()
this.storeChanges(player)
spend = this.tick(player, now.Unix(), elapsed)
if this.closed || player.exited {
player.unlock() // unlock
return
}
player.unlock() // unlock
if e-b >= 1000 {
this.logger.Warnf("[%s:%d] The executing time of the player loop function is too long, Time: %dms, userId: %d, roleId: %d",
if spend >= 1000 {
this.logger.Warnf("[%s:%d] The time spent executing the player loop function was too long, Time: %dms, userId: %d, roleId: %d",
player.Temp.Address,
player.RoleId,
e-b,
spend,
player.UserId,
player.RoleId)
}
@ -416,10 +421,11 @@ func (this *PlayerManager) Enter(player *Player, conn *net.Conn) {
this.PutPlayer(player)
player.lock()
defer player.unlock()
this.clearChanges(player)
player.enter(conn)
this.storeChanges(player)
player.unlock()
this.run(player)
@ -430,8 +436,9 @@ func (this *PlayerManager) Reenter(player *Player, conn *net.Conn) {
this.logger.Infof("[%s] The player reenter game, userId: %d, roleId: %d", player.Temp.Address, player.UserId, player.RoleId)
player.lock()
defer player.unlock()
player.reenter(conn)
player.unlock()
this.serverManager.AddOnline(1)
}
@ -442,8 +449,9 @@ func (this *PlayerManager) Exit(player *Player) {
this.RemovePlayer(player.UserId)
player.lock()
defer player.unlock()
player.exit()
player.lock()
this.serverManager.ReduceOnline(1)
}
@ -452,10 +460,20 @@ func (this *PlayerManager) Lost(player *Player) {
this.logger.Infof("[%s] The player lost, userId: %d, roleId: %d", player.Temp.Address, player.UserId, player.RoleId)
player.lock()
defer player.unlock()
player.lost(func() {
this.RemovePlayer(player.UserId)
})
player.unlock()
this.serverManager.ReduceOnline(1)
}
func (this *PlayerManager) kick(player *Player, message string) {
player.lock()
defer player.unlock()
player.kick(message)
this.serverManager.ReduceOnline(1)
}
@ -465,11 +483,7 @@ func (this *PlayerManager) Kick(player *Player, message string) {
this.RemovePlayer(player.UserId)
player.lock()
player.kick(message)
player.unlock()
this.serverManager.ReduceOnline(1)
this.kick(player, message)
}
func (this *PlayerManager) KickAll(message string) {
@ -479,11 +493,7 @@ func (this *PlayerManager) KickAll(message string) {
defer this.locker.Unlock()
for _, player := range this.players {
player.lock()
player.kick(message)
player.unlock()
this.serverManager.ReduceOnline(1)
this.kick(player, message)
}
this.players = map[uint64]*Player{}
}

View File

@ -98,8 +98,8 @@ type Player struct {
Temp PlayerTemp `bson:"-" json:"-"`
//Non-data
conn *net.Conn
mutex sync.Mutex
conn *net.Conn
locker sync.Mutex
exited bool
@ -129,11 +129,11 @@ func (this *Player) TipNotice(err proto.TipError) error {
}
func (this *Player) lock() {
this.mutex.Lock()
this.locker.Lock()
}
func (this *Player) unlock() {
this.mutex.Unlock()
this.locker.Unlock()
}
func (this *Player) sync() {

View File

@ -282,7 +282,8 @@ func (this *gameServer) Close() error {
}
func (this *gameServer) Load(dir string) error {
var dataTables, err = data.NewTables(dir)
var dataTables = data.NewTables(dir)
var err = dataTables.Load()
if err != nil {
return err
}