ecs/servers/game/data/tables.go
2025-07-16 10:05:22 +08:00

106 lines
2.1 KiB
Go

package data
import (
"crypto/md5"
"fmt"
"github.com/oylshe1314/framework/server"
"github.com/oylshe1314/framework/util"
"os"
"reflect"
"strings"
)
type tableLoader interface {
load(buf []byte) error
}
type Tables struct {
dataDir string
Achievement AchievementTable
Copy CopyTable
CopyMain CopyMainTable
Drop DropTable
Equip EquipTable
EquipLevel EquipLevelTable
EquipRefine EquipRefineTable
EquipSet EquipSetTable
Hero HeroTable
HeroBond HeroBondTable
HeroBook HeroBookTable
HeroBreak HeroBreakTable
HeroLevel HeroLevelTable
HeroSoul HeroSoulTable
FunctionOpen FunctionOpenTable
Item ItemTable
LotteryConfig LotteryConfigTable
LotteryPool LotteryPoolTable
Monster MonsterTable
RewardActive RewardActiveTable
RewardDaily RewardDailyTable
RewardLogin RewardLoginTable
Scene SceneTable
ServerConfig ServerConfigTable
Skill SkillTable
SkillBuff SkillBuffTable
Task TaskTable
Treasure TreasureTable
TreasureLevel TreasureLevelTable
TreasureRefine TreasureRefineTable
UpgradeMaster UpgradeMasterTable
}
func NewTables(dataDir string) (*Tables, error) {
var tables = &Tables{dataDir: dataDir}
var err = tables.load()
if err != nil {
return nil, err
}
return tables, nil
}
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") {
name = strings.TrimSuffix(name, "Table")
}
var fv = tv.Field(i)
loader, ok := fv.Addr().Interface().(tableLoader)
if !ok {
continue
}
buf, err := os.ReadFile(fmt.Sprintf("%s/tb%s.json", this.dataDir, strings.ToLower(name)))
if err != nil {
return err
}
err = loader.load(buf)
if err != nil {
return err
}
}
return nil
}