package mapcfg
/*******************************************************************************
Author: Yigui Lu (卢益贵)
Contact WX/QQ: 48092788
Blog: https://blog.csdn.net/guestcode
Creation by: 2024-3-16
*******************************************************************************/
// 本配置单元可以作为配置模板加载所有配置
import (
"cfgload/queue"
"fmt"
"io/ioutil"
"log"
"math/rand"
"time"
)
const ModuleName = "地图配置模块"
// 地图配置项,一个对应一个
type Item struct {
Name string // 地图名
ResName string // 地址资源名
ResData []byte // 资源数据
Attrs []int // 地图属性
}
// 外部类型:地图配置类
type Cfg struct {
Item *Item // 真正的配置对象是Item
LoadCount int
onReloads []func()
}
func (c *Cfg) AddOnReload(onReload func()) {
c.onReloads = append(c.onReloads, onReload)
}
// 配置表
type tcfgs = map[string]*Cfg
// 配置表实例
var cfgs = make(tcfgs)
func searchFiles(dir string) (ret []string) {
ret = append(ret, "南天门")
ret = append(ret, "老君殿")
ret = append(ret, "蟠桃园")
return
}
// 模拟获取碎片化的地图文件列表
var MapNames = searchFiles("./Config/maps")
// 模拟执行读配置文件
func doLoad(name string) *Cfg {
// 这里模拟读碎片化的配置文件ini(一个地图一个配置文件)
item := &Item{
Name: name,
ResName: name + ".map",
//Attrs: ...,
}
// 模拟读地图资源
item.ResData, _ = ioutil.ReadFile(item.ResName)
ret := cfgs[name]
if ret == nil {
ret = &Cfg{}
cfgs[name] = ret
} else {
// 如果已经加载过的则通知使用者重载了
// 在主线程调用重载通知回调(只有部分场景需求才需要通知)
for _, onReload := range ret.onReloads {
onReload()
}
}
ret.Item = item
ret.LoadCount++
log.Println(fmt.Sprintf("地图“%s”第%d次加载完毕", name, ret.LoadCount))
return ret
}
// 在主线程成调用获取地图配置函数
func Get(name string) *Cfg {
ret := cfgs[name]
if ret == nil {
ret = doLoad(name)
}
return ret
}
// 模拟20秒钟接受外部指令重载一次
func triggerGo() {
for {
index := rand.Intn(len(MapNames))
name := MapNames[index]
loadTask := func() {
log.Println("+++++++++++++++++")
log.Println("正在重载地图配置:" + name)
doLoad(name)
}
queue.MainQ <- loadTask
time.Sleep(time.Second * 20)
}
}
func init() {
go triggerGo()
}