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 }