Files
bl/common/data/xmlres/file.go
昔念 7a8be1c23a feat(element): 优化元素计算器并发安全与缓存机制
- 使用 sync.Map 替代 map+锁,提升并发读写性能
- 预加载所有元素组合,避免运行时重复创建
- 攻击系数计算结果加入缓存,提高查询效率
- 完善缓存键命名与错误处理机制
- 调整元素组合字符串展示格式,增强可读性

fix(item): 修复购买物品时价格为0仍扣除金币的问题

- 在购买逻辑中增加对物品价格是否为0的判断
- 防止免费物品被误扣金币
2025-11-02 23:52:06 +08:00

171 lines
4.0 KiB
Go

package xmlres
import (
"blazing/common/utils"
"encoding/json"
"os"
"github.com/ECUST-XX/xml"
"github.com/gogf/gf/v2/os/gctx"
"github.com/gogf/gf/v2/os/gfile"
"github.com/gogf/gf/v2/os/gfsnotify"
"github.com/gogf/gf/v2/os/glog"
"github.com/gogf/gf/v2/util/gconv"
)
var path string
func getXml[T any](path string) T {
// 解析XML到结构体
var xmls T
t1 := gfile.GetBytes(path)
xml.Unmarshal(t1, &xmls)
return xmls
}
func getJson[T any](path string) T {
// 解析XML到结构体
var xmls T
t1 := gfile.GetBytes(path)
json.Unmarshal(t1, &xmls)
return xmls
}
var (
MapConfig Maps //地图配置
ItemsConfig Items //物品配置
EffectArgsConfig EffectArg //arg参数
TalkConfig TalkRoot //任务配置
//Monster MonsterRoot //野怪配置
MonsterMap map[int]TMapConfig
//Skill MovesTbl //技能配置
SkillMap map[int]Move
PetMAP map[int]PetInfo //宠物配置
NatureRootMap map[int]NatureItem
EffectMAP map[int]NewSeIdx
PlayerEffectMAP map[int]NewSeIdx
ItemsMAP map[int]Item
TaskMap map[int]Task
ShopMap map[int]ShopItem
SkillTypeMap map[int]SkillType
RelationsMap map[int]Relation
)
func initfile() {
path1, _ := os.Getwd()
path = path1 + "/public/config/"
MapConfig = getXml[Maps](path + "210.xml")
ItemsConfig = getXml[Items](path + "43.xml")
EffectArgsConfig = getJson[EffectArg](path + "side_effect.json")
EffectArgs = make(map[int]int)
for _, t := range EffectArgsConfig.SideEffects.SideEffect {
EffectArgs[t.ID] = t.SideEffectArgcount
}
ItemsMAP = utils.ToMap[Item, int](ItemsConfig.Items, func(m Item) int {
return m.ID
})
TalkConfig = getXml[TalkRoot](path + "talk.xml")
Monster := getXml[MonsterRoot](path + "地图配置野怪.xml")
MonsterMap = utils.ToMap(Monster.Maps, func(m TMapConfig) int {
return m.ID
})
Shop1 := getXml[ShopRoot](path + "地图配置野怪.xml")
ShopMap = utils.ToMap(Shop1.Items, func(m ShopItem) int {
return gconv.Int(m.ProductID)
})
Skill := getXml[MovesTbl](path + "227.xml")
SkillMap = make(map[int]Move, len(Skill.Moves))
for _, v := range Skill.Moves {
v.SideEffectS = ParseSideEffectArgs(v.SideEffect)
v.SideEffectArgS = ParseSideEffectArgs(v.SideEffectArg)
SkillMap[v.ID] = v
}
task := getXml[Tasks](path + "task.xml")
TaskMap = utils.ToMap[Task, int](task.Tasks, func(m Task) int {
return m.ID
})
pet := getXml[Monsters](path + "226.xml")
PetMAP = utils.ToMap[PetInfo, int](pet.Monsters, func(m PetInfo) int {
return m.ID
})
NatureRootMap1 := getXml[NatureRoot](path + "nature.xml")
NatureRootMap = utils.ToMap[NatureItem, int](NatureRootMap1.Items, func(m NatureItem) int {
return m.ID
})
EffectMAP1 := getXml[NewSe](path + "bossbuff和特性.xml")
EffectMAP = make(map[int]NewSeIdx, len(EffectMAP1.SeIdxList))
for _, v := range EffectMAP1.SeIdxList {
v.ArgsS = ParseSideEffectArgs(v.Args)
EffectMAP[gconv.Int(v.Idx)] = v
}
PlayerEffectMAP = make(map[int]NewSeIdx)
for _, v := range EffectMAP1.SeIdxList {
if gconv.Int(v.Stat) == 1 && gconv.Int(v.StarLevel) == 0 && gconv.Int(v.Idx) > 1000 {
v.ArgsS = ParseSideEffectArgs(v.Args)
PlayerEffectMAP[gconv.Int(v.Idx)] = v
}
}
}
func init() {
initfile() //先初始化一次
go func() {
if !gfile.Exists(path) {
fileHandle, _ := gfile.Create(path)
fileHandle.Close()
}
//updatersares()
ctx := gctx.New()
_, err := gfsnotify.Add(path, func(event *gfsnotify.Event) {
if event.IsCreate() {
glog.Debug(ctx, "创建文件 : ", event.Path)
}
if event.IsWrite() {
glog.Debug(ctx, "写入文件 : ", event.Path)
initfile() //先初始化一次
}
if event.IsRemove() {
glog.Debug(ctx, "删除文件 : ", event.Path)
}
if event.IsRename() {
glog.Debug(ctx, "重命名文件 : ", event.Path)
}
if event.IsChmod() {
glog.Debug(ctx, "修改权限 : ", event.Path)
}
glog.Debug(ctx, event)
}, true)
if err != nil {
glog.Fatal(ctx, err)
} else {
select {}
}
}()
}