修正严重BUG
This commit is contained in:
parent
42912cdae6
commit
570f9a57fd
@ -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
|
||||
}
|
||||
|
@ -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{}
|
||||
}
|
||||
|
@ -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() {
|
||||
|
@ -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
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user