优化场景LUA处理

This commit is contained in:
flswld
2023-03-03 11:48:42 +08:00
parent 58b98f189d
commit 353403606d
9 changed files with 201 additions and 63 deletions

View File

@@ -158,16 +158,18 @@ func (g *GameDataConfig) readCsvFileData(fileName string) []byte {
return standardCsvData
}
func RegScriptLib(fnName string, fn lua.LGFunction) {
for _, sceneLuaConfig := range CONF.SceneLuaConfigMap {
for _, block := range sceneLuaConfig.BlockMap {
for _, group := range block.GroupMap {
luaState := group.LuaState
scriptLib := luaState.NewTable()
luaState.SetField(scriptLib, fnName, luaState.NewFunction(fn))
}
}
}
type ScriptLibFunc struct {
fnName string
fn lua.LGFunction
}
var SCRIPT_LIB_FUNC_LIST = make([]*ScriptLibFunc, 0)
func RegScriptLibFunc(fnName string, fn lua.LGFunction) {
SCRIPT_LIB_FUNC_LIST = append(SCRIPT_LIB_FUNC_LIST, &ScriptLibFunc{
fnName: fnName,
fn: fn,
})
}
func initLuaState(luaState *lua.LState) {
@@ -181,6 +183,9 @@ func initLuaState(luaState *lua.LState) {
luaState.SetGlobal("EntityType", entityType)
luaState.SetField(entityType, "NONE", lua.LNumber(constant.ENTITY_TYPE_NONE))
luaState.SetField(entityType, "AVATAR", lua.LNumber(constant.ENTITY_TYPE_AVATAR))
luaState.SetField(entityType, "MONSTER", lua.LNumber(constant.ENTITY_TYPE_MONSTER))
luaState.SetField(entityType, "NPC", lua.LNumber(constant.ENTITY_TYPE_NPC))
luaState.SetField(entityType, "GADGET", lua.LNumber(constant.ENTITY_TYPE_GADGET))
regionShape := luaState.NewTable()
luaState.SetGlobal("RegionShape", regionShape)
@@ -192,8 +197,11 @@ func initLuaState(luaState *lua.LState) {
questState := luaState.NewTable()
luaState.SetGlobal("QuestState", questState)
luaState.SetField(questState, "NONE", lua.LNumber(0))
luaState.SetField(questState, "UNFINISHED", lua.LNumber(1))
luaState.SetField(questState, "NONE", lua.LNumber(constant.QUEST_STATE_NONE))
luaState.SetField(questState, "UNSTARTED", lua.LNumber(constant.QUEST_STATE_UNSTARTED))
luaState.SetField(questState, "UNFINISHED", lua.LNumber(constant.QUEST_STATE_UNFINISHED))
luaState.SetField(questState, "FINISHED", lua.LNumber(constant.QUEST_STATE_FINISHED))
luaState.SetField(questState, "FAILED", lua.LNumber(constant.QUEST_STATE_FAILED))
gadgetState := luaState.NewTable()
luaState.SetGlobal("GadgetState", gadgetState)
@@ -228,7 +236,7 @@ func newLuaState(luaStr string) *lua.LState {
return luaState
}
func parseLuaTableToObject[T any](luaState *lua.LState, tableName string, object T) bool {
func getSceneLuaConfigTable[T any](luaState *lua.LState, tableName string, object T) bool {
luaValue := luaState.GetGlobal(tableName)
table, ok := luaValue.(*lua.LTable)
if !ok {
@@ -269,6 +277,24 @@ func parseLuaTableToObject[T any](luaState *lua.LState, tableName string, object
return true
}
func ParseLuaTableToObject[T any](table *lua.LTable, object T) bool {
tableObject := convLuaValueToGo(table)
jsonData, err := json.Marshal(tableObject)
if err != nil {
logger.Error("build json error: %v", err)
return false
}
if string(jsonData) == "{}" {
return true
}
err = json.Unmarshal(jsonData, object)
if err != nil {
logger.Error("parse json error: %v", err)
return false
}
return true
}
func convLuaValueToGo(lv lua.LValue) any {
switch v := lv.(type) {
case *lua.LNilType:

View File

@@ -68,6 +68,18 @@ type Group struct {
LuaState *lua.LState `json:"-"`
}
func (g *Group) GetLuaState() *lua.LState {
if g.LuaState == nil {
g.LuaState = newLuaState(g.LuaStr)
scriptLib := g.LuaState.NewTable()
g.LuaState.SetGlobal("ScriptLib", scriptLib)
for _, scriptLibFunc := range SCRIPT_LIB_FUNC_LIST {
g.LuaState.SetField(scriptLib, scriptLibFunc.fnName, g.LuaState.NewFunction(scriptLibFunc.fn))
}
}
return g.LuaState
}
type Replaceable struct {
Value bool `json:"value"`
Version int32 `json:"version"`
@@ -137,12 +149,12 @@ func (g *GameDataConfig) loadGroup(group *Group, block *Block, sceneId int32, bl
}
group.LuaStr = string(groupLuaData)
luaState := newLuaState(group.LuaStr)
group.LuaState = luaState
// monsters
group.MonsterList = make([]*Monster, 0)
ok := parseLuaTableToObject[*[]*Monster](luaState, "monsters", &group.MonsterList)
ok := getSceneLuaConfigTable[*[]*Monster](luaState, "monsters", &group.MonsterList)
if !ok {
logger.Error("get monsters object error, sceneId: %v, blockId: %v, groupId: %v", sceneId, blockId, groupId)
luaState.Close()
return
}
for _, monster := range group.MonsterList {
@@ -150,9 +162,10 @@ func (g *GameDataConfig) loadGroup(group *Group, block *Block, sceneId int32, bl
}
// npcs
group.NpcList = make([]*Npc, 0)
ok = parseLuaTableToObject[*[]*Npc](luaState, "npcs", &group.NpcList)
ok = getSceneLuaConfigTable[*[]*Npc](luaState, "npcs", &group.NpcList)
if !ok {
logger.Error("get npcs object error, sceneId: %v, blockId: %v, groupId: %v", sceneId, blockId, groupId)
luaState.Close()
return
}
for _, npc := range group.NpcList {
@@ -160,9 +173,10 @@ func (g *GameDataConfig) loadGroup(group *Group, block *Block, sceneId int32, bl
}
// gadgets
group.GadgetList = make([]*Gadget, 0)
ok = parseLuaTableToObject[*[]*Gadget](luaState, "gadgets", &group.GadgetList)
ok = getSceneLuaConfigTable[*[]*Gadget](luaState, "gadgets", &group.GadgetList)
if !ok {
logger.Error("get gadgets object error, sceneId: %v, blockId: %v, groupId: %v", sceneId, blockId, groupId)
luaState.Close()
return
}
for _, gadget := range group.GadgetList {
@@ -170,18 +184,21 @@ func (g *GameDataConfig) loadGroup(group *Group, block *Block, sceneId int32, bl
}
// regions
group.RegionList = make([]*Region, 0)
ok = parseLuaTableToObject[*[]*Region](luaState, "regions", &group.RegionList)
ok = getSceneLuaConfigTable[*[]*Region](luaState, "regions", &group.RegionList)
if !ok {
logger.Error("get regions object error, sceneId: %v, blockId: %v, groupId: %v", sceneId, blockId, groupId)
luaState.Close()
return
}
// triggers
group.TriggerList = make([]*Trigger, 0)
ok = parseLuaTableToObject[*[]*Trigger](luaState, "triggers", &group.TriggerList)
ok = getSceneLuaConfigTable[*[]*Trigger](luaState, "triggers", &group.TriggerList)
if !ok {
logger.Error("get triggers object error, sceneId: %v, blockId: %v, groupId: %v", sceneId, blockId, groupId)
luaState.Close()
return
}
luaState.Close()
block.groupMapLoadLock.Lock()
block.GroupMap[group.Id] = group
block.groupMapLoadLock.Unlock()
@@ -204,7 +221,7 @@ func (g *GameDataConfig) loadSceneLuaConfig() {
sceneLuaConfig.Id = sceneId
// scene_config
sceneLuaConfig.SceneConfig = new(SceneConfig)
ok := parseLuaTableToObject[*SceneConfig](luaState, "scene_config", sceneLuaConfig.SceneConfig)
ok := getSceneLuaConfigTable[*SceneConfig](luaState, "scene_config", sceneLuaConfig.SceneConfig)
if !ok {
logger.Error("get scene_config object error, sceneId: %v", sceneId)
luaState.Close()
@@ -213,7 +230,7 @@ func (g *GameDataConfig) loadSceneLuaConfig() {
sceneLuaConfig.BlockMap = make(map[int32]*Block)
// blocks
blockIdList := make([]int32, 0)
ok = parseLuaTableToObject[*[]int32](luaState, "blocks", &blockIdList)
ok = getSceneLuaConfigTable[*[]int32](luaState, "blocks", &blockIdList)
if !ok {
logger.Error("get blocks object error, sceneId: %v", sceneId)
luaState.Close()
@@ -221,7 +238,7 @@ func (g *GameDataConfig) loadSceneLuaConfig() {
}
// block_rects
blockRectList := make([]*BlockRange, 0)
ok = parseLuaTableToObject[*[]*BlockRange](luaState, "block_rects", &blockRectList)
ok = getSceneLuaConfigTable[*[]*BlockRange](luaState, "block_rects", &blockRectList)
luaState.Close()
if !ok {
logger.Error("get block_rects object error, sceneId: %v", sceneId)
@@ -244,7 +261,7 @@ func (g *GameDataConfig) loadSceneLuaConfig() {
// groups
block.GroupMap = make(map[int32]*Group)
groupList := make([]*Group, 0)
ok = parseLuaTableToObject[*[]*Group](luaState, "groups", &groupList)
ok = getSceneLuaConfigTable[*[]*Group](luaState, "groups", &groupList)
luaState.Close()
if !ok {
logger.Error("get groups object error, sceneId: %v, blockId: %v", sceneId, blockId)