微信公众号:GameToolDev
关注可了解更多的游戏工具开发教程。问题或建议,请公众号留言;
go.mod
module src
go 1.14
require (
github.com/aarzilli/golua v0.0.0-20200826074358-7f78a3b61a8b
github.com/yuin/gopher-lua v0.0.0-20200816102855-ee81675732da
)
main.go
package main
import (
"fmt"
"github.com/yuin/gopher-lua"
"io/ioutil"
"net/http"
"os"
"os/exec"
"strings"
)
func hello(L *lua.LState) int {
inputparam := L.ToInt(1)
_ = inputparam
// fmt.Println("func hello get:", inputparam)
//将返回参数压入栈中
L.Push(lua.LString("hello"))
//返回参数为1个
return 1
}
func main() {
fmt.Println()
fmt.Println("-----------------------------------")
fmt.Println("T.W Enjoy 服务器lua文件自动化生成工具")
fmt.Println("作者:彬哥")
fmt.Println("www.GameToolDev.Com")
fmt.Println("-----------------------------------")
fmt.Println()
L := lua.NewState()
defer L.Close()
err := L.DoFile("./itemtype.lua")
if err != nil {
fmt.Println("err", err.Error())
panic(err)
}
if true {
// 读取常量
//fmt.Println(L.GetGlobal("title"))
//title := L.GetGlobal("title")
//fmt.Println(reflect.TypeOf(title))
//fmt.Println(title)
// 读取表
Binge := L.GetGlobal("Binge")
if tbl, ok := Binge.(*lua.LTable); ok {
// lv is LTable
//fmt.Println(L.ObjLen(tbl))
//fmt.Println("--------------------------------------")
tbl.ForEach(func(value lua.LValue, value2 lua.LValue) {
// fmt.Println(value)
// fmt.Println("==========================================")
if tbl2, ok2 := value2.(*lua.LTable); ok2 {
tbl2.ForEach(func(value2 lua.LValue, value lua.LValue) {
// fmt.Println(value2)
// fmt.Println("============----",value)
})
}
//fmt.Println("==========================================")
})
//fmt.Println("--------------------------------------")
}
//fmt.Println(reflect.TypeOf(Binge))
}
// 结构体
type Now struct {
Id int
Name string
}
/*
data:=Now{
1,
"hao",
}
sss,_:=json.Marshal(data)
*/
//生成一个带名字的table
var t = L.NewTable()
t.RawSetString("ID", lua.LNumber(110))
t.RawSetString("Name", lua.LString("LULU"))
L.SetGlobal("stu_table", t)
tbltmp := L.NewTable()
tbltmp.Append(lua.LString("999"))
tbl := L.NewTable()
tbl.Append(tbltmp)
tbl.Append(t)
tbl.Append(lua.LNumber(3))
// 函数
if err := L.CallByParam(lua.P{
Fn: L.GetGlobal("GetStr"),
NRet: 1,
Protect: true,
}, lua.LString("nihao"), lua.LString("binge"), tbl); err != nil {
panic(err)
}
ret := L.Get(-1) // returned value
L.Pop(1) // remove received value
//fmt.Println("--------------------------------------",ret)
if tbl33, ok := ret.(*lua.LTable); ok {
tbl33.ForEach(func(value lua.LValue, value2 lua.LValue) {
//fmt.Println("--------------------------------------",value)
//fmt.Println("--------------------------------------",value2)
})
}
title := L.GetGlobal("title")
//fmt.Println(reflect.TypeOf(title))
fmt.Println(title)
//互相调用函数
//注册go函数
L.Register("hello", hello)
fn := L.GetGlobal("info")
if err := L.CallByParam(lua.P{
Fn: fn,
NRet: 1,
Protect: true,
}, lua.LNumber(1000)); err != nil {
panic(err)
}
// 格式化
fmt.Println("生成:" + title.String() + "完成!")
formatDir("./")
fmt.Println("格式化:" + title.String() + "完成!")
http.HandleFunc("/"+"/client/login", Login)
err = http.ListenAndServe(":8092", nil)
if err != nil {
return
}
}
func Login(w http.ResponseWriter, req *http.Request) {
}
func formatDir(path string) {
fileInfo, err := ioutil.ReadDir(path)
if err != nil {
fmt.Println("open directory error,", err.Error())
return
}
for _, file := range fileInfo {
fileName := path + "/" + file.Name()
if file.IsDir() {
// fmt.Println("dir :", fileName)
if file.Name() != "vendor" {
formatDir(fileName)
}
} else {
if strings.HasSuffix(file.Name(), "go") {
//fmt.Println("format go file :", fileName)
goFormatFile(fileName)
}
}
}
}
func goFormatFile(fileName string) {
cmd := exec.Command("go", "fmt", fileName)
cmd.Stdout = os.Stdout
cmd.Run()
}
itemtype.lua 模板函数
---------------------------------------------------------------------
-- 修改
luaname = "Map_proto"
-- 修改
Binge = {
[2] = { price = { {1, 202, 1}, {1, 202, 10}, }, number = { 1, 10, }, free_number = 0, reset = {“”, point = { 0, }, pool_id = { 4, 5, 6, 7, }, },
}
---------------------------------------------------------------------
function GetStr(data,data2,data3)
gFile = io.open(string.format("%s.go",luaname) ,"a");
-- 包名及导入库
gFile:write(string.format("package _go\nimport(\n \"fmt\"\n lua \"github.com/yuin/gopher-lua\" \n)"))
-- 全局定义 var Gitemtype_proto map[string]*STitemtype_proto
gFile:write(string.format("\nvar G%s map[string]*ST%s",luaname,luaname))
-- 结构体定义
gFile:write(string.format("\ntype ST%s struct {\n",luaname))
-- 结构体数据 Sid
gFile:write(string.format("Sid string\n"))
for key, value in pairs(Binge) do
for key, value in pairs(value) do
local Key = firstToUpper(key)
gFile:write(string.format("%s string\n",Key))
end
gFile:write(string.format("}\n"))
break
end
-- 写入初始化
gFile:write(string.format("\nfunc init(){\n"))
gFile:write(string.format("G%s = make(map[string]*ST%s)\n}\n",luaname,luaname))
-- 逻辑处理函数
gFile:write(string.format("\nfunc Init%s() {\n",luaname))
gFile:write(string.format("L := lua.NewState()\n"))
gFile:write(string.format("%stmp := make(map[string]*ST%s)\n",luaname,luaname))
gFile:write(string.format("defer L.Close()\n"))
gFile:write(string.format("err := L.DoFile(\"./lua/%s.lua\")\n",luaname))
gFile:write(string.format("if err != nil {\n"))
gFile:write(string.format("fmt.Println(\"err\", err.Error())\n"))
gFile:write(string.format("panic(err)\n}\n"))
gFile:write(string.format("%s := L.GetGlobal(\"%s\")\n",luaname,luaname))
gFile:write(string.format("if tbl, ok := %s.(*lua.LTable); ok {\n",luaname))
gFile:write(string.format("fmt.Println(L.ObjLen(tbl))\n"))
gFile:write(string.format("tbl.ForEach(func(value lua.LValue, value2 lua.LValue) {\n"))
gFile:write(string.format("data := new(ST%s)\n",luaname))
gFile:write(string.format("data.Sid = value.String()\n"))
gFile:write(string.format("if tbl2, ok2 := value2.(*lua.LTable); ok2 {\n"))
gFile:write(string.format("fmt.Println(L.ObjLen(tbl2))\n"))
gFile:write(string.format("tbl2.ForEach(func(value3 lua.LValue, value4 lua.LValue) {\n"))
-- key 循环
for key, value in pairs(Binge) do
for key, value in pairs(value) do
gFile:write(string.format("if \"%s\" == value3.String() {\n",key))
local Key = firstToUpper(key)
gFile:write(string.format("data.%s = value4.String()\n}\n",Key))
end
break
end
gFile:write(string.format("})\n}\n"))
-- key 结束
gFile:write(string.format("%stmp[data.Sid] = data\n",luaname))
gFile:write(string.format("})\n}\n"))
gFile:write(string.format("G%s = %stmp\n",luaname,luaname))
gFile:write(string.format("}\n"))
-- 结束
gFile:close()
return data3
end
--首字母大写(符合Go语言规则)
function firstToUpper(str)
return (str:gsub("^%l", string.upper))
end
---------------------------------------------------------------------------
title = string.format("%s.go",luaname)
function info(n)
ret = hello(n)
return ret
end
return Binge
生成go文件 如下:
package _go
import (
"fmt"
lua "github.com/yuin/gopher-lua"
)
var GMap_proto map[string]*STMap_proto
type STMap_proto struct {
Sid string
Price string
Number string
Free_number string
Reset string
Point string
Pool_id string
}
func init() {
GMap_proto = make(map[string]*STMap_proto)
}
func InitMap_proto() {
L := lua.NewState()
Map_prototmp := make(map[string]*STMap_proto)
defer L.Close()
err := L.DoFile("./lua/Map_proto.lua")
if err != nil {
fmt.Println("err", err.Error())
panic(err)
}
Map_proto := L.GetGlobal("Map_proto")
if tbl, ok := Map_proto.(*lua.LTable); ok {
fmt.Println(L.ObjLen(tbl))
tbl.ForEach(func(value lua.LValue, value2 lua.LValue) {
data := new(STMap_proto)
data.Sid = value.String()
if tbl2, ok2 := value2.(*lua.LTable); ok2 {
fmt.Println(L.ObjLen(tbl2))
tbl2.ForEach(func(value3 lua.LValue, value4 lua.LValue) {
if "price" == value3.String() {
data.Price = value4.String()
}
if "number" == value3.String() {
data.Number = value4.String()
}
if "free_number" == value3.String() {
data.Free_number = value4.String()
}
if "reset" == value3.String() {
data.Reset = value4.String()
}
if "point" == value3.String() {
data.Point = value4.String()
}
if "pool_id" == value3.String() {
data.Pool_id = value4.String()
}
})
}
Map_prototmp[data.Sid] = data
})
}
GMap_proto = Map_prototmp
}
版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢。
GameToolDev
ID:GameToolDev
www.GameToolDev.Com
游戏工具开发丨Unity开发技术丨AI技能编辑器丨地图编辑器