diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..dae6cf5
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,11 @@
+/.idea/
+/UnityGame/.idea/
+/UnityGame/Library/
+/UnityGame/Logs/
+/UnityGame/obj/
+/UnityGame/Temp/
+/UnityGame/Assembly-CSharp.csproj
+/UnityGame/FairyGUI.csproj
+/UnityGame/FairyGUI-Editor.csproj
+/UnityGame/UnityGame.sln
+/FairyGUIEditor/FairyGUI-Editor/
diff --git a/Config/MiniTemplate/Datas/#demo.item.xlsx b/Config/MiniTemplate/Datas/#demo.item.xlsx
new file mode 100644
index 0000000..974ed8b
Binary files /dev/null and b/Config/MiniTemplate/Datas/#demo.item.xlsx differ
diff --git a/Config/MiniTemplate/Datas/__beans__.xlsx b/Config/MiniTemplate/Datas/__beans__.xlsx
new file mode 100644
index 0000000..6fc990b
Binary files /dev/null and b/Config/MiniTemplate/Datas/__beans__.xlsx differ
diff --git a/Config/MiniTemplate/Datas/__enums__.xlsx b/Config/MiniTemplate/Datas/__enums__.xlsx
new file mode 100644
index 0000000..a005698
Binary files /dev/null and b/Config/MiniTemplate/Datas/__enums__.xlsx differ
diff --git a/Config/MiniTemplate/Datas/__tables__.xlsx b/Config/MiniTemplate/Datas/__tables__.xlsx
new file mode 100644
index 0000000..164c792
Binary files /dev/null and b/Config/MiniTemplate/Datas/__tables__.xlsx differ
diff --git a/Config/MiniTemplate/Defines/builtin.xml b/Config/MiniTemplate/Defines/builtin.xml
new file mode 100644
index 0000000..e535ff4
--- /dev/null
+++ b/Config/MiniTemplate/Defines/builtin.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Config/MiniTemplate/gen.bat b/Config/MiniTemplate/gen.bat
new file mode 100644
index 0000000..90a015e
--- /dev/null
+++ b/Config/MiniTemplate/gen.bat
@@ -0,0 +1,21 @@
+set WORKSPACE=..
+set LUBAN_DLL=%WORKSPACE%\Tools\Luban\Luban.dll
+set CONF_ROOT=.
+
+dotnet %LUBAN_DLL% ^
+ -t client ^
+ -c cs-bin ^
+ -d bin ^
+ --conf luban.conf ^
+ -x outputCodeDir=output/Gen ^
+ -x outputDataDir=output/bytes ^
+
+
+rmdir /S /Q "..\..\UnityGame\Assets\Scripts\GameLogic\Export\Config"
+mkdir "..\..\UnityGame\Assets\Scripts\GameLogic\Export\Config"
+rmdir /S /Q "..\..\UnityGame\Assets\AssetBundle\Config"
+mkdir "..\..\UnityGame\Assets\AssetBundle\Config"
+xcopy output\Gen ..\..\UnityGame\Assets\Scripts\GameLogic\Export\Config /E /I /Y
+xcopy output\bytes ..\..\UnityGame\Assets\AssetBundle\Config /E /I /Y
+
+pause
\ No newline at end of file
diff --git a/Config/MiniTemplate/gen.sh b/Config/MiniTemplate/gen.sh
new file mode 100644
index 0000000..5f48c8e
--- /dev/null
+++ b/Config/MiniTemplate/gen.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+
+WORKSPACE=..
+LUBAN_DLL=$WORKSPACE/Tools/Luban/Luban.dll
+CONF_ROOT=.
+
+dotnet $LUBAN_DLL \
+ -t all \
+ -d json \
+ --conf $CONF_ROOT/luban.conf \
+ -x outputDataDir=output
\ No newline at end of file
diff --git a/Config/MiniTemplate/luban.conf b/Config/MiniTemplate/luban.conf
new file mode 100644
index 0000000..716d6fb
--- /dev/null
+++ b/Config/MiniTemplate/luban.conf
@@ -0,0 +1,26 @@
+{
+ "groups":
+ [
+ {"names":["c"], "default":true},
+ {"names":["s"], "default":true},
+ {"names":["e"], "default":true}
+ ],
+ "schemaFiles":
+ [
+ {"fileName":"Defines", "type":""},
+ {"fileName":"Datas/__tables__.xlsx", "type":"table"},
+ {"fileName":"Datas/__beans__.xlsx", "type":"bean"},
+ {"fileName":"Datas/__enums__.xlsx", "type":"enum"}
+ ],
+ "dataDir": "Datas",
+ "targets":
+ [
+ {"name":"server", "manager":"Tables", "groups":["s"], "topModule":"cfg"},
+ {"name":"client", "manager":"Tables", "groups":["c"], "topModule":"cfg"},
+ {"name":"all", "manager":"Tables", "groups":["c","s","e"], "topModule":"cfg"}
+ ],
+ "xargs":
+ [
+
+ ]
+}
diff --git a/Config/MiniTemplate/output/Gen/Tables.cs b/Config/MiniTemplate/output/Gen/Tables.cs
new file mode 100644
index 0000000..f8a1f2f
--- /dev/null
+++ b/Config/MiniTemplate/output/Gen/Tables.cs
@@ -0,0 +1,30 @@
+
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+using Luban;
+
+namespace cfg
+{
+public partial class Tables
+{
+ public demo.Tbitem Tbitem {get; }
+
+ public Tables(System.Func loader)
+ {
+ Tbitem = new demo.Tbitem(loader("demo_tbitem"));
+ ResolveRef();
+ }
+
+ private void ResolveRef()
+ {
+ Tbitem.ResolveRef(this);
+ }
+}
+
+}
diff --git a/Config/MiniTemplate/output/Gen/demo/Tbitem.cs b/Config/MiniTemplate/output/Gen/demo/Tbitem.cs
new file mode 100644
index 0000000..ac2b195
--- /dev/null
+++ b/Config/MiniTemplate/output/Gen/demo/Tbitem.cs
@@ -0,0 +1,52 @@
+
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+using Luban;
+
+
+namespace cfg.demo
+{
+public partial class Tbitem
+{
+ private readonly System.Collections.Generic.Dictionary _dataMap;
+ private readonly System.Collections.Generic.List _dataList;
+
+ public Tbitem(ByteBuf _buf)
+ {
+ _dataMap = new System.Collections.Generic.Dictionary();
+ _dataList = new System.Collections.Generic.List();
+
+ for(int n = _buf.ReadSize() ; n > 0 ; --n)
+ {
+ demo.item _v;
+ _v = global::cfg.demo.item.Deserializeitem(_buf);
+ _dataList.Add(_v);
+ _dataMap.Add(_v.Id, _v);
+ }
+ }
+
+ public System.Collections.Generic.Dictionary DataMap => _dataMap;
+ public System.Collections.Generic.List DataList => _dataList;
+
+ public demo.item GetOrDefault(int key) => _dataMap.TryGetValue(key, out var v) ? v : null;
+ public demo.item Get(int key) => _dataMap[key];
+ public demo.item this[int key] => _dataMap[key];
+
+ public void ResolveRef(Tables tables)
+ {
+ foreach(var _v in _dataList)
+ {
+ _v.ResolveRef(tables);
+ }
+ }
+
+}
+
+}
+
diff --git a/Config/MiniTemplate/output/Gen/demo/item.cs b/Config/MiniTemplate/output/Gen/demo/item.cs
new file mode 100644
index 0000000..cd7ec13
--- /dev/null
+++ b/Config/MiniTemplate/output/Gen/demo/item.cs
@@ -0,0 +1,65 @@
+
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+using Luban;
+
+
+namespace cfg.demo
+{
+public sealed partial class item : Luban.BeanBase
+{
+ public item(ByteBuf _buf)
+ {
+ Id = _buf.ReadInt();
+ Name = _buf.ReadString();
+ Desc = _buf.ReadString();
+ Count = _buf.ReadInt();
+ }
+
+ public static item Deserializeitem(ByteBuf _buf)
+ {
+ return new demo.item(_buf);
+ }
+
+ ///
+ /// id
+ ///
+ public readonly int Id;
+ ///
+ /// 名称
+ ///
+ public readonly string Name;
+ ///
+ /// 描述
+ ///
+ public readonly string Desc;
+ ///
+ /// 个数
+ ///
+ public readonly int Count;
+
+ public const int __ID__ = 750578750;
+ public override int GetTypeId() => __ID__;
+
+ public void ResolveRef(Tables tables)
+ {
+ }
+
+ public override string ToString()
+ {
+ return "{ "
+ + "id:" + Id + ","
+ + "name:" + Name + ","
+ + "desc:" + Desc + ","
+ + "count:" + Count + ","
+ + "}";
+ }
+}
+}
+
diff --git a/Config/MiniTemplate/output/Gen/vector2.cs b/Config/MiniTemplate/output/Gen/vector2.cs
new file mode 100644
index 0000000..1b22093
--- /dev/null
+++ b/Config/MiniTemplate/output/Gen/vector2.cs
@@ -0,0 +1,45 @@
+
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+using Luban;
+
+
+namespace cfg
+{
+public partial struct vector2
+{
+ public vector2(ByteBuf _buf)
+ {
+ X = _buf.ReadFloat();
+ Y = _buf.ReadFloat();
+ }
+
+ public static vector2 Deserializevector2(ByteBuf _buf)
+ {
+ return new vector2(_buf);
+ }
+
+ public readonly float X;
+ public readonly float Y;
+
+
+ public void ResolveRef(Tables tables)
+ {
+ }
+
+ public override string ToString()
+ {
+ return "{ "
+ + "x:" + X + ","
+ + "y:" + Y + ","
+ + "}";
+ }
+}
+}
+
diff --git a/Config/MiniTemplate/output/Gen/vector3.cs b/Config/MiniTemplate/output/Gen/vector3.cs
new file mode 100644
index 0000000..1cc18d9
--- /dev/null
+++ b/Config/MiniTemplate/output/Gen/vector3.cs
@@ -0,0 +1,48 @@
+
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+using Luban;
+
+
+namespace cfg
+{
+public partial struct vector3
+{
+ public vector3(ByteBuf _buf)
+ {
+ X = _buf.ReadFloat();
+ Y = _buf.ReadFloat();
+ Z = _buf.ReadFloat();
+ }
+
+ public static vector3 Deserializevector3(ByteBuf _buf)
+ {
+ return new vector3(_buf);
+ }
+
+ public readonly float X;
+ public readonly float Y;
+ public readonly float Z;
+
+
+ public void ResolveRef(Tables tables)
+ {
+ }
+
+ public override string ToString()
+ {
+ return "{ "
+ + "x:" + X + ","
+ + "y:" + Y + ","
+ + "z:" + Z + ","
+ + "}";
+ }
+}
+}
+
diff --git a/Config/MiniTemplate/output/Gen/vector4.cs b/Config/MiniTemplate/output/Gen/vector4.cs
new file mode 100644
index 0000000..3b33e38
--- /dev/null
+++ b/Config/MiniTemplate/output/Gen/vector4.cs
@@ -0,0 +1,51 @@
+
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+using Luban;
+
+
+namespace cfg
+{
+public partial struct vector4
+{
+ public vector4(ByteBuf _buf)
+ {
+ X = _buf.ReadFloat();
+ Y = _buf.ReadFloat();
+ Z = _buf.ReadFloat();
+ W = _buf.ReadFloat();
+ }
+
+ public static vector4 Deserializevector4(ByteBuf _buf)
+ {
+ return new vector4(_buf);
+ }
+
+ public readonly float X;
+ public readonly float Y;
+ public readonly float Z;
+ public readonly float W;
+
+
+ public void ResolveRef(Tables tables)
+ {
+ }
+
+ public override string ToString()
+ {
+ return "{ "
+ + "x:" + X + ","
+ + "y:" + Y + ","
+ + "z:" + Z + ","
+ + "w:" + W + ","
+ + "}";
+ }
+}
+}
+
diff --git a/Config/MiniTemplate/output/bytes/demo_tbitem.bytes b/Config/MiniTemplate/output/bytes/demo_tbitem.bytes
new file mode 100644
index 0000000..6db22b4
--- /dev/null
+++ b/Config/MiniTemplate/output/bytes/demo_tbitem.bytes
@@ -0,0 +1,2 @@
+道具1描述1
+道具2描述2d
\ No newline at end of file
diff --git a/Config/MiniTemplate/output/demo_tbitem.json b/Config/MiniTemplate/output/demo_tbitem.json
new file mode 100644
index 0000000..06e888f
--- /dev/null
+++ b/Config/MiniTemplate/output/demo_tbitem.json
@@ -0,0 +1,14 @@
+[
+ {
+ "id": 1001,
+ "name": "道具1",
+ "desc": "描述1",
+ "count": 10
+ },
+ {
+ "id": 1002,
+ "name": "道具2",
+ "desc": "描述2",
+ "count": 100
+ }
+]
\ No newline at end of file
diff --git a/Config/README.md b/Config/README.md
new file mode 100644
index 0000000..ee3eb41
--- /dev/null
+++ b/Config/README.md
@@ -0,0 +1,2 @@
+# Config
+luban导表工具,表格相关的全部放这里
diff --git a/Config/Tools/Luban/CommandLine.dll b/Config/Tools/Luban/CommandLine.dll
new file mode 100644
index 0000000..3eab2be
Binary files /dev/null and b/Config/Tools/Luban/CommandLine.dll differ
diff --git a/Config/Tools/Luban/ExcelDataReader.dll b/Config/Tools/Luban/ExcelDataReader.dll
new file mode 100644
index 0000000..c730b00
Binary files /dev/null and b/Config/Tools/Luban/ExcelDataReader.dll differ
diff --git a/Config/Tools/Luban/Google.Protobuf.dll b/Config/Tools/Luban/Google.Protobuf.dll
new file mode 100644
index 0000000..3cd0950
Binary files /dev/null and b/Config/Tools/Luban/Google.Protobuf.dll differ
diff --git a/Config/Tools/Luban/Luban.Bson.deps.json b/Config/Tools/Luban/Luban.Bson.deps.json
new file mode 100644
index 0000000..e2df5d0
--- /dev/null
+++ b/Config/Tools/Luban/Luban.Bson.deps.json
@@ -0,0 +1,107 @@
+{
+ "runtimeTarget": {
+ "name": ".NETCoreApp,Version=v8.0",
+ "signature": ""
+ },
+ "compilationOptions": {},
+ "targets": {
+ ".NETCoreApp,Version=v8.0": {
+ "Luban.Bson/1.0.0": {
+ "dependencies": {
+ "Luban.Core": "1.0.0",
+ "Newtonsoft.Json.Bson": "1.0.3"
+ },
+ "runtime": {
+ "Luban.Bson.dll": {}
+ }
+ },
+ "Newtonsoft.Json/13.0.1": {
+ "runtime": {
+ "lib/netstandard2.0/Newtonsoft.Json.dll": {
+ "assemblyVersion": "13.0.0.0",
+ "fileVersion": "13.0.1.25517"
+ }
+ }
+ },
+ "Newtonsoft.Json.Bson/1.0.3": {
+ "dependencies": {
+ "Newtonsoft.Json": "13.0.1"
+ },
+ "runtime": {
+ "lib/netstandard2.0/Newtonsoft.Json.Bson.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.3.29904"
+ }
+ }
+ },
+ "NLog/5.3.4": {
+ "runtime": {
+ "lib/netstandard2.0/NLog.dll": {
+ "assemblyVersion": "5.0.0.0",
+ "fileVersion": "5.3.4.2778"
+ }
+ }
+ },
+ "Scriban/5.12.0": {
+ "runtime": {
+ "lib/net7.0/Scriban.dll": {
+ "assemblyVersion": "5.0.0.0",
+ "fileVersion": "5.12.0.0"
+ }
+ }
+ },
+ "Luban.Core/1.0.0": {
+ "dependencies": {
+ "NLog": "5.3.4",
+ "Scriban": "5.12.0"
+ },
+ "runtime": {
+ "Luban.Core.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ }
+ }
+ },
+ "libraries": {
+ "Luban.Bson/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "Newtonsoft.Json/13.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==",
+ "path": "newtonsoft.json/13.0.1",
+ "hashPath": "newtonsoft.json.13.0.1.nupkg.sha512"
+ },
+ "Newtonsoft.Json.Bson/1.0.3": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-bCcwagnHfYnhwQfY1criEcn6Hy9PtBuVnZu0pA8hmRhuR3jI/8WxVgoVAdNw9BJ3JHkxmWJzpj/AQy+PMMLqxg==",
+ "path": "newtonsoft.json.bson/1.0.3",
+ "hashPath": "newtonsoft.json.bson.1.0.3.nupkg.sha512"
+ },
+ "NLog/5.3.4": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-gLy7+O1hEYJXIlcTr1/VWjGXrZTQFZzYNO18IWasD64pNwz0BreV+nHLxWKXWZzERRzoKnsk2XYtwLkTVk7J1A==",
+ "path": "nlog/5.3.4",
+ "hashPath": "nlog.5.3.4.nupkg.sha512"
+ },
+ "Scriban/5.12.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-/YTTCxjBIpfwX3MKMT4JMFVl1jX4IHW7zih+Bg3cTIkzGnbFt+B3l/k90ILDw6DRiFE7T+VxEyls7zk4p029ng==",
+ "path": "scriban/5.12.0",
+ "hashPath": "scriban.5.12.0.nupkg.sha512"
+ },
+ "Luban.Core/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ }
+ }
+}
\ No newline at end of file
diff --git a/Config/Tools/Luban/Luban.Bson.dll b/Config/Tools/Luban/Luban.Bson.dll
new file mode 100644
index 0000000..46af1c1
Binary files /dev/null and b/Config/Tools/Luban/Luban.Bson.dll differ
diff --git a/Config/Tools/Luban/Luban.CSharp.deps.json b/Config/Tools/Luban/Luban.CSharp.deps.json
new file mode 100644
index 0000000..fdab829
--- /dev/null
+++ b/Config/Tools/Luban/Luban.CSharp.deps.json
@@ -0,0 +1,73 @@
+{
+ "runtimeTarget": {
+ "name": ".NETCoreApp,Version=v8.0",
+ "signature": ""
+ },
+ "compilationOptions": {},
+ "targets": {
+ ".NETCoreApp,Version=v8.0": {
+ "Luban.CSharp/1.0.0": {
+ "dependencies": {
+ "Luban.Core": "1.0.0",
+ "Luban.DataValidator.Builtin": "1.0.0"
+ },
+ "runtime": {
+ "Luban.CSharp.dll": {}
+ }
+ },
+ "NLog/5.3.4": {
+ "runtime": {
+ "lib/netstandard2.0/NLog.dll": {
+ "assemblyVersion": "5.0.0.0",
+ "fileVersion": "5.3.4.2778"
+ }
+ }
+ },
+ "Scriban/5.12.0": {
+ "runtime": {
+ "lib/net7.0/Scriban.dll": {
+ "assemblyVersion": "5.0.0.0",
+ "fileVersion": "5.12.0.0"
+ }
+ }
+ },
+ "Luban.DataValidator.Builtin/1.0.0": {
+ "dependencies": {
+ "Luban.Core": "1.0.0"
+ },
+ "runtime": {
+ "Luban.DataValidator.Builtin.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ }
+ }
+ },
+ "libraries": {
+ "Luban.CSharp/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "NLog/5.3.4": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-gLy7+O1hEYJXIlcTr1/VWjGXrZTQFZzYNO18IWasD64pNwz0BreV+nHLxWKXWZzERRzoKnsk2XYtwLkTVk7J1A==",
+ "path": "nlog/5.3.4",
+ "hashPath": "nlog.5.3.4.nupkg.sha512"
+ },
+ "Scriban/5.12.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-/YTTCxjBIpfwX3MKMT4JMFVl1jX4IHW7zih+Bg3cTIkzGnbFt+B3l/k90ILDw6DRiFE7T+VxEyls7zk4p029ng==",
+ "path": "scriban/5.12.0",
+ "hashPath": "scriban.5.12.0.nupkg.sha512"
+ },
+ "Luban.DataValidator.Builtin/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ }
+ }
+}
\ No newline at end of file
diff --git a/Config/Tools/Luban/Luban.CSharp.dll b/Config/Tools/Luban/Luban.CSharp.dll
new file mode 100644
index 0000000..9c7b344
Binary files /dev/null and b/Config/Tools/Luban/Luban.CSharp.dll differ
diff --git a/Config/Tools/Luban/Luban.Core.deps.json b/Config/Tools/Luban/Luban.Core.deps.json
new file mode 100644
index 0000000..03f0487
--- /dev/null
+++ b/Config/Tools/Luban/Luban.Core.deps.json
@@ -0,0 +1,57 @@
+{
+ "runtimeTarget": {
+ "name": ".NETCoreApp,Version=v8.0",
+ "signature": ""
+ },
+ "compilationOptions": {},
+ "targets": {
+ ".NETCoreApp,Version=v8.0": {
+ "Luban.Core/1.0.0": {
+ "dependencies": {
+ "NLog": "5.3.4",
+ "Scriban": "5.12.0"
+ },
+ "runtime": {
+ "Luban.Core.dll": {}
+ }
+ },
+ "NLog/5.3.4": {
+ "runtime": {
+ "lib/netstandard2.0/NLog.dll": {
+ "assemblyVersion": "5.0.0.0",
+ "fileVersion": "5.3.4.2778"
+ }
+ }
+ },
+ "Scriban/5.12.0": {
+ "runtime": {
+ "lib/net7.0/Scriban.dll": {
+ "assemblyVersion": "5.0.0.0",
+ "fileVersion": "5.12.0.0"
+ }
+ }
+ }
+ }
+ },
+ "libraries": {
+ "Luban.Core/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "NLog/5.3.4": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-gLy7+O1hEYJXIlcTr1/VWjGXrZTQFZzYNO18IWasD64pNwz0BreV+nHLxWKXWZzERRzoKnsk2XYtwLkTVk7J1A==",
+ "path": "nlog/5.3.4",
+ "hashPath": "nlog.5.3.4.nupkg.sha512"
+ },
+ "Scriban/5.12.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-/YTTCxjBIpfwX3MKMT4JMFVl1jX4IHW7zih+Bg3cTIkzGnbFt+B3l/k90ILDw6DRiFE7T+VxEyls7zk4p029ng==",
+ "path": "scriban/5.12.0",
+ "hashPath": "scriban.5.12.0.nupkg.sha512"
+ }
+ }
+}
\ No newline at end of file
diff --git a/Config/Tools/Luban/Luban.Core.dll b/Config/Tools/Luban/Luban.Core.dll
new file mode 100644
index 0000000..179c2e9
Binary files /dev/null and b/Config/Tools/Luban/Luban.Core.dll differ
diff --git a/Config/Tools/Luban/Luban.Cpp.deps.json b/Config/Tools/Luban/Luban.Cpp.deps.json
new file mode 100644
index 0000000..f01523e
--- /dev/null
+++ b/Config/Tools/Luban/Luban.Cpp.deps.json
@@ -0,0 +1,73 @@
+{
+ "runtimeTarget": {
+ "name": ".NETCoreApp,Version=v8.0",
+ "signature": ""
+ },
+ "compilationOptions": {},
+ "targets": {
+ ".NETCoreApp,Version=v8.0": {
+ "Luban.Cpp/1.0.0": {
+ "dependencies": {
+ "Luban.Core": "1.0.0"
+ },
+ "runtime": {
+ "Luban.Cpp.dll": {}
+ }
+ },
+ "NLog/5.3.4": {
+ "runtime": {
+ "lib/netstandard2.0/NLog.dll": {
+ "assemblyVersion": "5.0.0.0",
+ "fileVersion": "5.3.4.2778"
+ }
+ }
+ },
+ "Scriban/5.12.0": {
+ "runtime": {
+ "lib/net7.0/Scriban.dll": {
+ "assemblyVersion": "5.0.0.0",
+ "fileVersion": "5.12.0.0"
+ }
+ }
+ },
+ "Luban.Core/1.0.0": {
+ "dependencies": {
+ "NLog": "5.3.4",
+ "Scriban": "5.12.0"
+ },
+ "runtime": {
+ "Luban.Core.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ }
+ }
+ },
+ "libraries": {
+ "Luban.Cpp/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "NLog/5.3.4": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-gLy7+O1hEYJXIlcTr1/VWjGXrZTQFZzYNO18IWasD64pNwz0BreV+nHLxWKXWZzERRzoKnsk2XYtwLkTVk7J1A==",
+ "path": "nlog/5.3.4",
+ "hashPath": "nlog.5.3.4.nupkg.sha512"
+ },
+ "Scriban/5.12.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-/YTTCxjBIpfwX3MKMT4JMFVl1jX4IHW7zih+Bg3cTIkzGnbFt+B3l/k90ILDw6DRiFE7T+VxEyls7zk4p029ng==",
+ "path": "scriban/5.12.0",
+ "hashPath": "scriban.5.12.0.nupkg.sha512"
+ },
+ "Luban.Core/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ }
+ }
+}
\ No newline at end of file
diff --git a/Config/Tools/Luban/Luban.Cpp.dll b/Config/Tools/Luban/Luban.Cpp.dll
new file mode 100644
index 0000000..f22560c
Binary files /dev/null and b/Config/Tools/Luban/Luban.Cpp.dll differ
diff --git a/Config/Tools/Luban/Luban.Dart.deps.json b/Config/Tools/Luban/Luban.Dart.deps.json
new file mode 100644
index 0000000..a9857b1
--- /dev/null
+++ b/Config/Tools/Luban/Luban.Dart.deps.json
@@ -0,0 +1,73 @@
+{
+ "runtimeTarget": {
+ "name": ".NETCoreApp,Version=v8.0",
+ "signature": ""
+ },
+ "compilationOptions": {},
+ "targets": {
+ ".NETCoreApp,Version=v8.0": {
+ "Luban.Dart/1.0.0": {
+ "dependencies": {
+ "Luban.Core": "1.0.0"
+ },
+ "runtime": {
+ "Luban.Dart.dll": {}
+ }
+ },
+ "NLog/5.3.4": {
+ "runtime": {
+ "lib/netstandard2.0/NLog.dll": {
+ "assemblyVersion": "5.0.0.0",
+ "fileVersion": "5.3.4.2778"
+ }
+ }
+ },
+ "Scriban/5.12.0": {
+ "runtime": {
+ "lib/net7.0/Scriban.dll": {
+ "assemblyVersion": "5.0.0.0",
+ "fileVersion": "5.12.0.0"
+ }
+ }
+ },
+ "Luban.Core/1.0.0": {
+ "dependencies": {
+ "NLog": "5.3.4",
+ "Scriban": "5.12.0"
+ },
+ "runtime": {
+ "Luban.Core.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ }
+ }
+ },
+ "libraries": {
+ "Luban.Dart/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "NLog/5.3.4": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-gLy7+O1hEYJXIlcTr1/VWjGXrZTQFZzYNO18IWasD64pNwz0BreV+nHLxWKXWZzERRzoKnsk2XYtwLkTVk7J1A==",
+ "path": "nlog/5.3.4",
+ "hashPath": "nlog.5.3.4.nupkg.sha512"
+ },
+ "Scriban/5.12.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-/YTTCxjBIpfwX3MKMT4JMFVl1jX4IHW7zih+Bg3cTIkzGnbFt+B3l/k90ILDw6DRiFE7T+VxEyls7zk4p029ng==",
+ "path": "scriban/5.12.0",
+ "hashPath": "scriban.5.12.0.nupkg.sha512"
+ },
+ "Luban.Core/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ }
+ }
+}
\ No newline at end of file
diff --git a/Config/Tools/Luban/Luban.Dart.dll b/Config/Tools/Luban/Luban.Dart.dll
new file mode 100644
index 0000000..56f2a58
Binary files /dev/null and b/Config/Tools/Luban/Luban.Dart.dll differ
diff --git a/Config/Tools/Luban/Luban.DataLoader.Builtin.deps.json b/Config/Tools/Luban/Luban.DataLoader.Builtin.deps.json
new file mode 100644
index 0000000..62beda5
--- /dev/null
+++ b/Config/Tools/Luban/Luban.DataLoader.Builtin.deps.json
@@ -0,0 +1,547 @@
+{
+ "runtimeTarget": {
+ "name": ".NETCoreApp,Version=v8.0",
+ "signature": ""
+ },
+ "compilationOptions": {},
+ "targets": {
+ ".NETCoreApp,Version=v8.0": {
+ "Luban.DataLoader.Builtin/1.0.0": {
+ "dependencies": {
+ "ExcelDataReader": "3.7.0",
+ "Luban.Core": "1.0.0",
+ "NeoLua": "1.3.14",
+ "Ude.NetStandard": "1.2.0",
+ "YamlDotNet.NetCore": "1.0.0"
+ },
+ "runtime": {
+ "Luban.DataLoader.Builtin.dll": {}
+ }
+ },
+ "ExcelDataReader/3.7.0": {
+ "runtime": {
+ "lib/netstandard2.1/ExcelDataReader.dll": {
+ "assemblyVersion": "3.7.0.0",
+ "fileVersion": "3.7.0.0"
+ }
+ }
+ },
+ "Microsoft.CSharp/4.5.0": {},
+ "Microsoft.NETCore.Platforms/1.0.1": {},
+ "Microsoft.NETCore.Targets/1.0.1": {},
+ "NeoLua/1.3.14": {
+ "dependencies": {
+ "Microsoft.CSharp": "4.5.0"
+ },
+ "runtime": {
+ "lib/net5.0/Neo.Lua.dll": {
+ "assemblyVersion": "5.3.0.0",
+ "fileVersion": "1.3.14.0"
+ }
+ },
+ "resources": {
+ "lib/net5.0/de/Neo.Lua.resources.dll": {
+ "locale": "de"
+ }
+ }
+ },
+ "NLog/5.3.4": {
+ "runtime": {
+ "lib/netstandard2.0/NLog.dll": {
+ "assemblyVersion": "5.0.0.0",
+ "fileVersion": "5.3.4.2778"
+ }
+ }
+ },
+ "Scriban/5.12.0": {
+ "runtime": {
+ "lib/net7.0/Scriban.dll": {
+ "assemblyVersion": "5.0.0.0",
+ "fileVersion": "5.12.0.0"
+ }
+ }
+ },
+ "System.Collections/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Diagnostics.Debug/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Diagnostics.Tools/4.0.1": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Globalization/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.IO/4.1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Text.Encoding": "4.0.11",
+ "System.Threading.Tasks": "4.0.11"
+ }
+ },
+ "System.Linq/4.1.0": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0"
+ }
+ },
+ "System.Linq.Expressions/4.1.0": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Globalization": "4.0.11",
+ "System.IO": "4.1.0",
+ "System.Linq": "4.1.0",
+ "System.ObjectModel": "4.0.12",
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Emit": "4.0.1",
+ "System.Reflection.Emit.ILGeneration": "4.0.1",
+ "System.Reflection.Emit.Lightweight": "4.0.1",
+ "System.Reflection.Extensions": "4.0.1",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Reflection.TypeExtensions": "4.1.0",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Threading": "4.0.11"
+ }
+ },
+ "System.ObjectModel/4.0.12": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Threading": "4.0.11"
+ }
+ },
+ "System.Reflection/4.1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.IO": "4.1.0",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Emit/4.0.1": {
+ "dependencies": {
+ "System.IO": "4.1.0",
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Emit.ILGeneration": "4.0.1",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Emit.ILGeneration/4.0.1": {
+ "dependencies": {
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Emit.Lightweight/4.0.1": {
+ "dependencies": {
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Emit.ILGeneration": "4.0.1",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Extensions/4.0.1": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Reflection": "4.1.0",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Primitives/4.0.1": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.TypeExtensions/4.1.0": {
+ "dependencies": {
+ "System.Reflection": "4.1.0",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Resources.ResourceManager/4.0.1": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Globalization": "4.0.11",
+ "System.Reflection": "4.1.0",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Runtime/4.1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1"
+ }
+ },
+ "System.Runtime.Extensions/4.1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Runtime.Serialization.Primitives/4.1.1": {
+ "dependencies": {
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Text.Encoding/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Text.Encoding.Extensions/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Text.Encoding": "4.0.11"
+ }
+ },
+ "System.Text.RegularExpressions/4.1.0": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Globalization": "4.0.11",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Threading": "4.0.11"
+ }
+ },
+ "System.Threading/4.0.11": {
+ "dependencies": {
+ "System.Runtime": "4.1.0",
+ "System.Threading.Tasks": "4.0.11"
+ }
+ },
+ "System.Threading.Tasks/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "Ude.NetStandard/1.2.0": {
+ "runtime": {
+ "lib/netstandard2.0/Ude.NetStandard.dll": {
+ "assemblyVersion": "1.0.2.0",
+ "fileVersion": "1.0.2.0"
+ }
+ }
+ },
+ "YamlDotNet.NetCore/1.0.0": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Diagnostics.Tools": "4.0.1",
+ "System.Globalization": "4.0.11",
+ "System.Linq": "4.1.0",
+ "System.Linq.Expressions": "4.1.0",
+ "System.ObjectModel": "4.0.12",
+ "System.Reflection.Extensions": "4.0.1",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Runtime.Serialization.Primitives": "4.1.1",
+ "System.Text.Encoding.Extensions": "4.0.11",
+ "System.Text.RegularExpressions": "4.1.0"
+ },
+ "runtime": {
+ "lib/netstandard1.0/YamlDotNet.NetCore.dll": {
+ "assemblyVersion": "0.0.1.0",
+ "fileVersion": "0.0.0.0"
+ }
+ }
+ },
+ "Luban.Core/1.0.0": {
+ "dependencies": {
+ "NLog": "5.3.4",
+ "Scriban": "5.12.0"
+ },
+ "runtime": {
+ "Luban.Core.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ }
+ }
+ },
+ "libraries": {
+ "Luban.DataLoader.Builtin/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "ExcelDataReader/3.7.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-AMv3oDETRHSRyXC17rBtKH45qIfFyo433LMeaMB3u4RNr/c9Luuc0Z+JMP6+3Cx9n4wXqFqcrEIVxrf/GgYnZg==",
+ "path": "exceldatareader/3.7.0",
+ "hashPath": "exceldatareader.3.7.0.nupkg.sha512"
+ },
+ "Microsoft.CSharp/4.5.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-kaj6Wb4qoMuH3HySFJhxwQfe8R/sJsNJnANrvv8WdFPMoNbKY5htfNscv+LHCu5ipz+49m2e+WQXpLXr9XYemQ==",
+ "path": "microsoft.csharp/4.5.0",
+ "hashPath": "microsoft.csharp.4.5.0.nupkg.sha512"
+ },
+ "Microsoft.NETCore.Platforms/1.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-2G6OjjJzwBfNOO8myRV/nFrbTw5iA+DEm0N+qUqhrOmaVtn4pC77h38I1jsXGw5VH55+dPfQsqHD0We9sCl9FQ==",
+ "path": "microsoft.netcore.platforms/1.0.1",
+ "hashPath": "microsoft.netcore.platforms.1.0.1.nupkg.sha512"
+ },
+ "Microsoft.NETCore.Targets/1.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-rkn+fKobF/cbWfnnfBOQHKVKIOpxMZBvlSHkqDWgBpwGDcLRduvs3D9OLGeV6GWGvVwNlVi2CBbTjuPmtHvyNw==",
+ "path": "microsoft.netcore.targets/1.0.1",
+ "hashPath": "microsoft.netcore.targets.1.0.1.nupkg.sha512"
+ },
+ "NeoLua/1.3.14": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-BXIUN+ePY2wx3ZGiSmR8KZKD85s01pXI690orrB3u/biB8R0nalziGw+iGbPBq1Cuz8Upggpw2ERF84POXWTCQ==",
+ "path": "neolua/1.3.14",
+ "hashPath": "neolua.1.3.14.nupkg.sha512"
+ },
+ "NLog/5.3.4": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-gLy7+O1hEYJXIlcTr1/VWjGXrZTQFZzYNO18IWasD64pNwz0BreV+nHLxWKXWZzERRzoKnsk2XYtwLkTVk7J1A==",
+ "path": "nlog/5.3.4",
+ "hashPath": "nlog.5.3.4.nupkg.sha512"
+ },
+ "Scriban/5.12.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-/YTTCxjBIpfwX3MKMT4JMFVl1jX4IHW7zih+Bg3cTIkzGnbFt+B3l/k90ILDw6DRiFE7T+VxEyls7zk4p029ng==",
+ "path": "scriban/5.12.0",
+ "hashPath": "scriban.5.12.0.nupkg.sha512"
+ },
+ "System.Collections/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-YUJGz6eFKqS0V//mLt25vFGrrCvOnsXjlvFQs+KimpwNxug9x0Pzy4PlFMU3Q2IzqAa9G2L4LsK3+9vCBK7oTg==",
+ "path": "system.collections/4.0.11",
+ "hashPath": "system.collections.4.0.11.nupkg.sha512"
+ },
+ "System.Diagnostics.Debug/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-w5U95fVKHY4G8ASs/K5iK3J5LY+/dLFd4vKejsnI/ZhBsWS9hQakfx3Zr7lRWKg4tAw9r4iktyvsTagWkqYCiw==",
+ "path": "system.diagnostics.debug/4.0.11",
+ "hashPath": "system.diagnostics.debug.4.0.11.nupkg.sha512"
+ },
+ "System.Diagnostics.Tools/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-xBfJ8pnd4C17dWaC9FM6aShzbJcRNMChUMD42I6772KGGrqaFdumwhn9OdM68erj1ueNo3xdQ1EwiFjK5k8p0g==",
+ "path": "system.diagnostics.tools/4.0.1",
+ "hashPath": "system.diagnostics.tools.4.0.1.nupkg.sha512"
+ },
+ "System.Globalization/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-B95h0YLEL2oSnwF/XjqSWKnwKOy/01VWkNlsCeMTFJLLabflpGV26nK164eRs5GiaRSBGpOxQ3pKoSnnyZN5pg==",
+ "path": "system.globalization/4.0.11",
+ "hashPath": "system.globalization.4.0.11.nupkg.sha512"
+ },
+ "System.IO/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-3KlTJceQc3gnGIaHZ7UBZO26SHL1SHE4ddrmiwumFnId+CEHP+O8r386tZKaE6zlk5/mF8vifMBzHj9SaXN+mQ==",
+ "path": "system.io/4.1.0",
+ "hashPath": "system.io.4.1.0.nupkg.sha512"
+ },
+ "System.Linq/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-bQ0iYFOQI0nuTnt+NQADns6ucV4DUvMdwN6CbkB1yj8i7arTGiTN5eok1kQwdnnNWSDZfIUySQY+J3d5KjWn0g==",
+ "path": "system.linq/4.1.0",
+ "hashPath": "system.linq.4.1.0.nupkg.sha512"
+ },
+ "System.Linq.Expressions/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-I+y02iqkgmCAyfbqOmSDOgqdZQ5tTj80Akm5BPSS8EeB0VGWdy6X1KCoYe8Pk6pwDoAKZUOdLVxnTJcExiv5zw==",
+ "path": "system.linq.expressions/4.1.0",
+ "hashPath": "system.linq.expressions.4.1.0.nupkg.sha512"
+ },
+ "System.ObjectModel/4.0.12": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-tAgJM1xt3ytyMoW4qn4wIqgJYm7L7TShRZG4+Q4Qsi2PCcj96pXN7nRywS9KkB3p/xDUjc2HSwP9SROyPYDYKQ==",
+ "path": "system.objectmodel/4.0.12",
+ "hashPath": "system.objectmodel.4.0.12.nupkg.sha512"
+ },
+ "System.Reflection/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-JCKANJ0TI7kzoQzuwB/OoJANy1Lg338B6+JVacPl4TpUwi3cReg3nMLplMq2uqYfHFQpKIlHAUVAJlImZz/4ng==",
+ "path": "system.reflection/4.1.0",
+ "hashPath": "system.reflection.4.1.0.nupkg.sha512"
+ },
+ "System.Reflection.Emit/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-P2wqAj72fFjpP6wb9nSfDqNBMab+2ovzSDzUZK7MVIm54tBJEPr9jWfSjjoTpPwj1LeKcmX3vr0ttyjSSFM47g==",
+ "path": "system.reflection.emit/4.0.1",
+ "hashPath": "system.reflection.emit.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.Emit.ILGeneration/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-Ov6dU8Bu15Bc7zuqttgHF12J5lwSWyTf1S+FJouUXVMSqImLZzYaQ+vRr1rQ0OZ0HqsrwWl4dsKHELckQkVpgA==",
+ "path": "system.reflection.emit.ilgeneration/4.0.1",
+ "hashPath": "system.reflection.emit.ilgeneration.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.Emit.Lightweight/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-sSzHHXueZ5Uh0OLpUQprhr+ZYJrLPA2Cmr4gn0wj9+FftNKXx8RIMKvO9qnjk2ebPYUjZ+F2ulGdPOsvj+MEjA==",
+ "path": "system.reflection.emit.lightweight/4.0.1",
+ "hashPath": "system.reflection.emit.lightweight.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.Extensions/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-GYrtRsZcMuHF3sbmRHfMYpvxZoIN2bQGrYGerUiWLEkqdEUQZhH3TRSaC/oI4wO0II1RKBPlpIa1TOMxIcOOzQ==",
+ "path": "system.reflection.extensions/4.0.1",
+ "hashPath": "system.reflection.extensions.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.Primitives/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-4inTox4wTBaDhB7V3mPvp9XlCbeGYWVEM9/fXALd52vNEAVisc1BoVWQPuUuD0Ga//dNbA/WeMy9u9mzLxGTHQ==",
+ "path": "system.reflection.primitives/4.0.1",
+ "hashPath": "system.reflection.primitives.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.TypeExtensions/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-tsQ/ptQ3H5FYfON8lL4MxRk/8kFyE0A+tGPXmVP967cT/gzLHYxIejIYSxp4JmIeFHVP78g/F2FE1mUUTbDtrg==",
+ "path": "system.reflection.typeextensions/4.1.0",
+ "hashPath": "system.reflection.typeextensions.4.1.0.nupkg.sha512"
+ },
+ "System.Resources.ResourceManager/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-TxwVeUNoTgUOdQ09gfTjvW411MF+w9MBYL7AtNVc+HtBCFlutPLhUCdZjNkjbhj3bNQWMdHboF0KIWEOjJssbA==",
+ "path": "system.resources.resourcemanager/4.0.1",
+ "hashPath": "system.resources.resourcemanager.4.0.1.nupkg.sha512"
+ },
+ "System.Runtime/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-v6c/4Yaa9uWsq+JMhnOFewrYkgdNHNG2eMKuNqRn8P733rNXeRCGvV5FkkjBXn2dbVkPXOsO0xjsEeM1q2zC0g==",
+ "path": "system.runtime/4.1.0",
+ "hashPath": "system.runtime.4.1.0.nupkg.sha512"
+ },
+ "System.Runtime.Extensions/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-CUOHjTT/vgP0qGW22U4/hDlOqXmcPq5YicBaXdUR2UiUoLwBT+olO6we4DVbq57jeX5uXH2uerVZhf0qGj+sVQ==",
+ "path": "system.runtime.extensions/4.1.0",
+ "hashPath": "system.runtime.extensions.4.1.0.nupkg.sha512"
+ },
+ "System.Runtime.Serialization.Primitives/4.1.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-HZ6Du5QrTG8MNJbf4e4qMO3JRAkIboGT5Fk804uZtg3Gq516S7hAqTm2UZKUHa7/6HUGdVy3AqMQKbns06G/cg==",
+ "path": "system.runtime.serialization.primitives/4.1.1",
+ "hashPath": "system.runtime.serialization.primitives.4.1.1.nupkg.sha512"
+ },
+ "System.Text.Encoding/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-U3gGeMlDZXxCEiY4DwVLSacg+DFWCvoiX+JThA/rvw37Sqrku7sEFeVBBBMBnfB6FeZHsyDx85HlKL19x0HtZA==",
+ "path": "system.text.encoding/4.0.11",
+ "hashPath": "system.text.encoding.4.0.11.nupkg.sha512"
+ },
+ "System.Text.Encoding.Extensions/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-jtbiTDtvfLYgXn8PTfWI+SiBs51rrmO4AAckx4KR6vFK9Wzf6tI8kcRdsYQNwriUeQ1+CtQbM1W4cMbLXnj/OQ==",
+ "path": "system.text.encoding.extensions/4.0.11",
+ "hashPath": "system.text.encoding.extensions.4.0.11.nupkg.sha512"
+ },
+ "System.Text.RegularExpressions/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-i88YCXpRTjCnoSQZtdlHkAOx4KNNik4hMy83n0+Ftlb7jvV6ZiZWMpnEZHhjBp6hQVh8gWd/iKNPzlPF7iyA2g==",
+ "path": "system.text.regularexpressions/4.1.0",
+ "hashPath": "system.text.regularexpressions.4.1.0.nupkg.sha512"
+ },
+ "System.Threading/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-N+3xqIcg3VDKyjwwCGaZ9HawG9aC6cSDI+s7ROma310GQo8vilFZa86hqKppwTHleR/G0sfOzhvgnUxWCR/DrQ==",
+ "path": "system.threading/4.0.11",
+ "hashPath": "system.threading.4.0.11.nupkg.sha512"
+ },
+ "System.Threading.Tasks/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-k1S4Gc6IGwtHGT8188RSeGaX86Qw/wnrgNLshJvsdNUOPP9etMmo8S07c+UlOAx4K/xLuN9ivA1bD0LVurtIxQ==",
+ "path": "system.threading.tasks/4.0.11",
+ "hashPath": "system.threading.tasks.4.0.11.nupkg.sha512"
+ },
+ "Ude.NetStandard/1.2.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-zRWpPAxBg3lNdm4UiKixTe+DFPoNid9CILggTCy/0WR2WKETe17kTWhiiIpLB2k5IEgnvA0QLfKlvd6Tvu0pzA==",
+ "path": "ude.netstandard/1.2.0",
+ "hashPath": "ude.netstandard.1.2.0.nupkg.sha512"
+ },
+ "YamlDotNet.NetCore/1.0.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-vPiKF4Yf02MS96Nzwcr8+WrvlhTx+camOgUzxhazU0hCzs2ESetWDCxaIT/MYdAw2oONYem1ow9PXWJjHkRUDw==",
+ "path": "yamldotnet.netcore/1.0.0",
+ "hashPath": "yamldotnet.netcore.1.0.0.nupkg.sha512"
+ },
+ "Luban.Core/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ }
+ }
+}
\ No newline at end of file
diff --git a/Config/Tools/Luban/Luban.DataLoader.Builtin.dll b/Config/Tools/Luban/Luban.DataLoader.Builtin.dll
new file mode 100644
index 0000000..9968a7d
Binary files /dev/null and b/Config/Tools/Luban/Luban.DataLoader.Builtin.dll differ
diff --git a/Config/Tools/Luban/Luban.DataTarget.Builtin.deps.json b/Config/Tools/Luban/Luban.DataTarget.Builtin.deps.json
new file mode 100644
index 0000000..45659dd
--- /dev/null
+++ b/Config/Tools/Luban/Luban.DataTarget.Builtin.deps.json
@@ -0,0 +1,564 @@
+{
+ "runtimeTarget": {
+ "name": ".NETCoreApp,Version=v8.0",
+ "signature": ""
+ },
+ "compilationOptions": {},
+ "targets": {
+ ".NETCoreApp,Version=v8.0": {
+ "Luban.DataTarget.Builtin/1.0.0": {
+ "dependencies": {
+ "Luban.Core": "1.0.0",
+ "Luban.DataLoader.Builtin": "1.0.0"
+ },
+ "runtime": {
+ "Luban.DataTarget.Builtin.dll": {}
+ }
+ },
+ "ExcelDataReader/3.7.0": {
+ "runtime": {
+ "lib/netstandard2.1/ExcelDataReader.dll": {
+ "assemblyVersion": "3.7.0.0",
+ "fileVersion": "3.7.0.0"
+ }
+ }
+ },
+ "Microsoft.CSharp/4.5.0": {},
+ "Microsoft.NETCore.Platforms/1.0.1": {},
+ "Microsoft.NETCore.Targets/1.0.1": {},
+ "NeoLua/1.3.14": {
+ "dependencies": {
+ "Microsoft.CSharp": "4.5.0"
+ },
+ "runtime": {
+ "lib/net5.0/Neo.Lua.dll": {
+ "assemblyVersion": "5.3.0.0",
+ "fileVersion": "1.3.14.0"
+ }
+ },
+ "resources": {
+ "lib/net5.0/de/Neo.Lua.resources.dll": {
+ "locale": "de"
+ }
+ }
+ },
+ "NLog/5.3.4": {
+ "runtime": {
+ "lib/netstandard2.0/NLog.dll": {
+ "assemblyVersion": "5.0.0.0",
+ "fileVersion": "5.3.4.2778"
+ }
+ }
+ },
+ "Scriban/5.12.0": {
+ "runtime": {
+ "lib/net7.0/Scriban.dll": {
+ "assemblyVersion": "5.0.0.0",
+ "fileVersion": "5.12.0.0"
+ }
+ }
+ },
+ "System.Collections/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Diagnostics.Debug/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Diagnostics.Tools/4.0.1": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Globalization/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.IO/4.1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Text.Encoding": "4.0.11",
+ "System.Threading.Tasks": "4.0.11"
+ }
+ },
+ "System.Linq/4.1.0": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0"
+ }
+ },
+ "System.Linq.Expressions/4.1.0": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Globalization": "4.0.11",
+ "System.IO": "4.1.0",
+ "System.Linq": "4.1.0",
+ "System.ObjectModel": "4.0.12",
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Emit": "4.0.1",
+ "System.Reflection.Emit.ILGeneration": "4.0.1",
+ "System.Reflection.Emit.Lightweight": "4.0.1",
+ "System.Reflection.Extensions": "4.0.1",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Reflection.TypeExtensions": "4.1.0",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Threading": "4.0.11"
+ }
+ },
+ "System.ObjectModel/4.0.12": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Threading": "4.0.11"
+ }
+ },
+ "System.Reflection/4.1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.IO": "4.1.0",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Emit/4.0.1": {
+ "dependencies": {
+ "System.IO": "4.1.0",
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Emit.ILGeneration": "4.0.1",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Emit.ILGeneration/4.0.1": {
+ "dependencies": {
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Emit.Lightweight/4.0.1": {
+ "dependencies": {
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Emit.ILGeneration": "4.0.1",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Extensions/4.0.1": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Reflection": "4.1.0",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Primitives/4.0.1": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.TypeExtensions/4.1.0": {
+ "dependencies": {
+ "System.Reflection": "4.1.0",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Resources.ResourceManager/4.0.1": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Globalization": "4.0.11",
+ "System.Reflection": "4.1.0",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Runtime/4.1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1"
+ }
+ },
+ "System.Runtime.Extensions/4.1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Runtime.Serialization.Primitives/4.1.1": {
+ "dependencies": {
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Text.Encoding/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Text.Encoding.Extensions/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Text.Encoding": "4.0.11"
+ }
+ },
+ "System.Text.RegularExpressions/4.1.0": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Globalization": "4.0.11",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Threading": "4.0.11"
+ }
+ },
+ "System.Threading/4.0.11": {
+ "dependencies": {
+ "System.Runtime": "4.1.0",
+ "System.Threading.Tasks": "4.0.11"
+ }
+ },
+ "System.Threading.Tasks/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "Ude.NetStandard/1.2.0": {
+ "runtime": {
+ "lib/netstandard2.0/Ude.NetStandard.dll": {
+ "assemblyVersion": "1.0.2.0",
+ "fileVersion": "1.0.2.0"
+ }
+ }
+ },
+ "YamlDotNet.NetCore/1.0.0": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Diagnostics.Tools": "4.0.1",
+ "System.Globalization": "4.0.11",
+ "System.Linq": "4.1.0",
+ "System.Linq.Expressions": "4.1.0",
+ "System.ObjectModel": "4.0.12",
+ "System.Reflection.Extensions": "4.0.1",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Runtime.Serialization.Primitives": "4.1.1",
+ "System.Text.Encoding.Extensions": "4.0.11",
+ "System.Text.RegularExpressions": "4.1.0"
+ },
+ "runtime": {
+ "lib/netstandard1.0/YamlDotNet.NetCore.dll": {
+ "assemblyVersion": "0.0.1.0",
+ "fileVersion": "0.0.0.0"
+ }
+ }
+ },
+ "Luban.Core/1.0.0": {
+ "dependencies": {
+ "NLog": "5.3.4",
+ "Scriban": "5.12.0"
+ },
+ "runtime": {
+ "Luban.Core.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ },
+ "Luban.DataLoader.Builtin/1.0.0": {
+ "dependencies": {
+ "ExcelDataReader": "3.7.0",
+ "Luban.Core": "1.0.0",
+ "NeoLua": "1.3.14",
+ "Ude.NetStandard": "1.2.0",
+ "YamlDotNet.NetCore": "1.0.0"
+ },
+ "runtime": {
+ "Luban.DataLoader.Builtin.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ }
+ }
+ },
+ "libraries": {
+ "Luban.DataTarget.Builtin/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "ExcelDataReader/3.7.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-AMv3oDETRHSRyXC17rBtKH45qIfFyo433LMeaMB3u4RNr/c9Luuc0Z+JMP6+3Cx9n4wXqFqcrEIVxrf/GgYnZg==",
+ "path": "exceldatareader/3.7.0",
+ "hashPath": "exceldatareader.3.7.0.nupkg.sha512"
+ },
+ "Microsoft.CSharp/4.5.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-kaj6Wb4qoMuH3HySFJhxwQfe8R/sJsNJnANrvv8WdFPMoNbKY5htfNscv+LHCu5ipz+49m2e+WQXpLXr9XYemQ==",
+ "path": "microsoft.csharp/4.5.0",
+ "hashPath": "microsoft.csharp.4.5.0.nupkg.sha512"
+ },
+ "Microsoft.NETCore.Platforms/1.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-2G6OjjJzwBfNOO8myRV/nFrbTw5iA+DEm0N+qUqhrOmaVtn4pC77h38I1jsXGw5VH55+dPfQsqHD0We9sCl9FQ==",
+ "path": "microsoft.netcore.platforms/1.0.1",
+ "hashPath": "microsoft.netcore.platforms.1.0.1.nupkg.sha512"
+ },
+ "Microsoft.NETCore.Targets/1.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-rkn+fKobF/cbWfnnfBOQHKVKIOpxMZBvlSHkqDWgBpwGDcLRduvs3D9OLGeV6GWGvVwNlVi2CBbTjuPmtHvyNw==",
+ "path": "microsoft.netcore.targets/1.0.1",
+ "hashPath": "microsoft.netcore.targets.1.0.1.nupkg.sha512"
+ },
+ "NeoLua/1.3.14": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-BXIUN+ePY2wx3ZGiSmR8KZKD85s01pXI690orrB3u/biB8R0nalziGw+iGbPBq1Cuz8Upggpw2ERF84POXWTCQ==",
+ "path": "neolua/1.3.14",
+ "hashPath": "neolua.1.3.14.nupkg.sha512"
+ },
+ "NLog/5.3.4": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-gLy7+O1hEYJXIlcTr1/VWjGXrZTQFZzYNO18IWasD64pNwz0BreV+nHLxWKXWZzERRzoKnsk2XYtwLkTVk7J1A==",
+ "path": "nlog/5.3.4",
+ "hashPath": "nlog.5.3.4.nupkg.sha512"
+ },
+ "Scriban/5.12.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-/YTTCxjBIpfwX3MKMT4JMFVl1jX4IHW7zih+Bg3cTIkzGnbFt+B3l/k90ILDw6DRiFE7T+VxEyls7zk4p029ng==",
+ "path": "scriban/5.12.0",
+ "hashPath": "scriban.5.12.0.nupkg.sha512"
+ },
+ "System.Collections/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-YUJGz6eFKqS0V//mLt25vFGrrCvOnsXjlvFQs+KimpwNxug9x0Pzy4PlFMU3Q2IzqAa9G2L4LsK3+9vCBK7oTg==",
+ "path": "system.collections/4.0.11",
+ "hashPath": "system.collections.4.0.11.nupkg.sha512"
+ },
+ "System.Diagnostics.Debug/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-w5U95fVKHY4G8ASs/K5iK3J5LY+/dLFd4vKejsnI/ZhBsWS9hQakfx3Zr7lRWKg4tAw9r4iktyvsTagWkqYCiw==",
+ "path": "system.diagnostics.debug/4.0.11",
+ "hashPath": "system.diagnostics.debug.4.0.11.nupkg.sha512"
+ },
+ "System.Diagnostics.Tools/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-xBfJ8pnd4C17dWaC9FM6aShzbJcRNMChUMD42I6772KGGrqaFdumwhn9OdM68erj1ueNo3xdQ1EwiFjK5k8p0g==",
+ "path": "system.diagnostics.tools/4.0.1",
+ "hashPath": "system.diagnostics.tools.4.0.1.nupkg.sha512"
+ },
+ "System.Globalization/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-B95h0YLEL2oSnwF/XjqSWKnwKOy/01VWkNlsCeMTFJLLabflpGV26nK164eRs5GiaRSBGpOxQ3pKoSnnyZN5pg==",
+ "path": "system.globalization/4.0.11",
+ "hashPath": "system.globalization.4.0.11.nupkg.sha512"
+ },
+ "System.IO/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-3KlTJceQc3gnGIaHZ7UBZO26SHL1SHE4ddrmiwumFnId+CEHP+O8r386tZKaE6zlk5/mF8vifMBzHj9SaXN+mQ==",
+ "path": "system.io/4.1.0",
+ "hashPath": "system.io.4.1.0.nupkg.sha512"
+ },
+ "System.Linq/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-bQ0iYFOQI0nuTnt+NQADns6ucV4DUvMdwN6CbkB1yj8i7arTGiTN5eok1kQwdnnNWSDZfIUySQY+J3d5KjWn0g==",
+ "path": "system.linq/4.1.0",
+ "hashPath": "system.linq.4.1.0.nupkg.sha512"
+ },
+ "System.Linq.Expressions/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-I+y02iqkgmCAyfbqOmSDOgqdZQ5tTj80Akm5BPSS8EeB0VGWdy6X1KCoYe8Pk6pwDoAKZUOdLVxnTJcExiv5zw==",
+ "path": "system.linq.expressions/4.1.0",
+ "hashPath": "system.linq.expressions.4.1.0.nupkg.sha512"
+ },
+ "System.ObjectModel/4.0.12": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-tAgJM1xt3ytyMoW4qn4wIqgJYm7L7TShRZG4+Q4Qsi2PCcj96pXN7nRywS9KkB3p/xDUjc2HSwP9SROyPYDYKQ==",
+ "path": "system.objectmodel/4.0.12",
+ "hashPath": "system.objectmodel.4.0.12.nupkg.sha512"
+ },
+ "System.Reflection/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-JCKANJ0TI7kzoQzuwB/OoJANy1Lg338B6+JVacPl4TpUwi3cReg3nMLplMq2uqYfHFQpKIlHAUVAJlImZz/4ng==",
+ "path": "system.reflection/4.1.0",
+ "hashPath": "system.reflection.4.1.0.nupkg.sha512"
+ },
+ "System.Reflection.Emit/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-P2wqAj72fFjpP6wb9nSfDqNBMab+2ovzSDzUZK7MVIm54tBJEPr9jWfSjjoTpPwj1LeKcmX3vr0ttyjSSFM47g==",
+ "path": "system.reflection.emit/4.0.1",
+ "hashPath": "system.reflection.emit.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.Emit.ILGeneration/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-Ov6dU8Bu15Bc7zuqttgHF12J5lwSWyTf1S+FJouUXVMSqImLZzYaQ+vRr1rQ0OZ0HqsrwWl4dsKHELckQkVpgA==",
+ "path": "system.reflection.emit.ilgeneration/4.0.1",
+ "hashPath": "system.reflection.emit.ilgeneration.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.Emit.Lightweight/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-sSzHHXueZ5Uh0OLpUQprhr+ZYJrLPA2Cmr4gn0wj9+FftNKXx8RIMKvO9qnjk2ebPYUjZ+F2ulGdPOsvj+MEjA==",
+ "path": "system.reflection.emit.lightweight/4.0.1",
+ "hashPath": "system.reflection.emit.lightweight.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.Extensions/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-GYrtRsZcMuHF3sbmRHfMYpvxZoIN2bQGrYGerUiWLEkqdEUQZhH3TRSaC/oI4wO0II1RKBPlpIa1TOMxIcOOzQ==",
+ "path": "system.reflection.extensions/4.0.1",
+ "hashPath": "system.reflection.extensions.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.Primitives/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-4inTox4wTBaDhB7V3mPvp9XlCbeGYWVEM9/fXALd52vNEAVisc1BoVWQPuUuD0Ga//dNbA/WeMy9u9mzLxGTHQ==",
+ "path": "system.reflection.primitives/4.0.1",
+ "hashPath": "system.reflection.primitives.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.TypeExtensions/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-tsQ/ptQ3H5FYfON8lL4MxRk/8kFyE0A+tGPXmVP967cT/gzLHYxIejIYSxp4JmIeFHVP78g/F2FE1mUUTbDtrg==",
+ "path": "system.reflection.typeextensions/4.1.0",
+ "hashPath": "system.reflection.typeextensions.4.1.0.nupkg.sha512"
+ },
+ "System.Resources.ResourceManager/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-TxwVeUNoTgUOdQ09gfTjvW411MF+w9MBYL7AtNVc+HtBCFlutPLhUCdZjNkjbhj3bNQWMdHboF0KIWEOjJssbA==",
+ "path": "system.resources.resourcemanager/4.0.1",
+ "hashPath": "system.resources.resourcemanager.4.0.1.nupkg.sha512"
+ },
+ "System.Runtime/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-v6c/4Yaa9uWsq+JMhnOFewrYkgdNHNG2eMKuNqRn8P733rNXeRCGvV5FkkjBXn2dbVkPXOsO0xjsEeM1q2zC0g==",
+ "path": "system.runtime/4.1.0",
+ "hashPath": "system.runtime.4.1.0.nupkg.sha512"
+ },
+ "System.Runtime.Extensions/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-CUOHjTT/vgP0qGW22U4/hDlOqXmcPq5YicBaXdUR2UiUoLwBT+olO6we4DVbq57jeX5uXH2uerVZhf0qGj+sVQ==",
+ "path": "system.runtime.extensions/4.1.0",
+ "hashPath": "system.runtime.extensions.4.1.0.nupkg.sha512"
+ },
+ "System.Runtime.Serialization.Primitives/4.1.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-HZ6Du5QrTG8MNJbf4e4qMO3JRAkIboGT5Fk804uZtg3Gq516S7hAqTm2UZKUHa7/6HUGdVy3AqMQKbns06G/cg==",
+ "path": "system.runtime.serialization.primitives/4.1.1",
+ "hashPath": "system.runtime.serialization.primitives.4.1.1.nupkg.sha512"
+ },
+ "System.Text.Encoding/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-U3gGeMlDZXxCEiY4DwVLSacg+DFWCvoiX+JThA/rvw37Sqrku7sEFeVBBBMBnfB6FeZHsyDx85HlKL19x0HtZA==",
+ "path": "system.text.encoding/4.0.11",
+ "hashPath": "system.text.encoding.4.0.11.nupkg.sha512"
+ },
+ "System.Text.Encoding.Extensions/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-jtbiTDtvfLYgXn8PTfWI+SiBs51rrmO4AAckx4KR6vFK9Wzf6tI8kcRdsYQNwriUeQ1+CtQbM1W4cMbLXnj/OQ==",
+ "path": "system.text.encoding.extensions/4.0.11",
+ "hashPath": "system.text.encoding.extensions.4.0.11.nupkg.sha512"
+ },
+ "System.Text.RegularExpressions/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-i88YCXpRTjCnoSQZtdlHkAOx4KNNik4hMy83n0+Ftlb7jvV6ZiZWMpnEZHhjBp6hQVh8gWd/iKNPzlPF7iyA2g==",
+ "path": "system.text.regularexpressions/4.1.0",
+ "hashPath": "system.text.regularexpressions.4.1.0.nupkg.sha512"
+ },
+ "System.Threading/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-N+3xqIcg3VDKyjwwCGaZ9HawG9aC6cSDI+s7ROma310GQo8vilFZa86hqKppwTHleR/G0sfOzhvgnUxWCR/DrQ==",
+ "path": "system.threading/4.0.11",
+ "hashPath": "system.threading.4.0.11.nupkg.sha512"
+ },
+ "System.Threading.Tasks/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-k1S4Gc6IGwtHGT8188RSeGaX86Qw/wnrgNLshJvsdNUOPP9etMmo8S07c+UlOAx4K/xLuN9ivA1bD0LVurtIxQ==",
+ "path": "system.threading.tasks/4.0.11",
+ "hashPath": "system.threading.tasks.4.0.11.nupkg.sha512"
+ },
+ "Ude.NetStandard/1.2.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-zRWpPAxBg3lNdm4UiKixTe+DFPoNid9CILggTCy/0WR2WKETe17kTWhiiIpLB2k5IEgnvA0QLfKlvd6Tvu0pzA==",
+ "path": "ude.netstandard/1.2.0",
+ "hashPath": "ude.netstandard.1.2.0.nupkg.sha512"
+ },
+ "YamlDotNet.NetCore/1.0.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-vPiKF4Yf02MS96Nzwcr8+WrvlhTx+camOgUzxhazU0hCzs2ESetWDCxaIT/MYdAw2oONYem1ow9PXWJjHkRUDw==",
+ "path": "yamldotnet.netcore/1.0.0",
+ "hashPath": "yamldotnet.netcore.1.0.0.nupkg.sha512"
+ },
+ "Luban.Core/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "Luban.DataLoader.Builtin/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ }
+ }
+}
\ No newline at end of file
diff --git a/Config/Tools/Luban/Luban.DataTarget.Builtin.dll b/Config/Tools/Luban/Luban.DataTarget.Builtin.dll
new file mode 100644
index 0000000..309cb59
Binary files /dev/null and b/Config/Tools/Luban/Luban.DataTarget.Builtin.dll differ
diff --git a/Config/Tools/Luban/Luban.DataValidator.Builtin.deps.json b/Config/Tools/Luban/Luban.DataValidator.Builtin.deps.json
new file mode 100644
index 0000000..0616312
--- /dev/null
+++ b/Config/Tools/Luban/Luban.DataValidator.Builtin.deps.json
@@ -0,0 +1,73 @@
+{
+ "runtimeTarget": {
+ "name": ".NETCoreApp,Version=v8.0",
+ "signature": ""
+ },
+ "compilationOptions": {},
+ "targets": {
+ ".NETCoreApp,Version=v8.0": {
+ "Luban.DataValidator.Builtin/1.0.0": {
+ "dependencies": {
+ "Luban.Core": "1.0.0"
+ },
+ "runtime": {
+ "Luban.DataValidator.Builtin.dll": {}
+ }
+ },
+ "NLog/5.3.4": {
+ "runtime": {
+ "lib/netstandard2.0/NLog.dll": {
+ "assemblyVersion": "5.0.0.0",
+ "fileVersion": "5.3.4.2778"
+ }
+ }
+ },
+ "Scriban/5.12.0": {
+ "runtime": {
+ "lib/net7.0/Scriban.dll": {
+ "assemblyVersion": "5.0.0.0",
+ "fileVersion": "5.12.0.0"
+ }
+ }
+ },
+ "Luban.Core/1.0.0": {
+ "dependencies": {
+ "NLog": "5.3.4",
+ "Scriban": "5.12.0"
+ },
+ "runtime": {
+ "Luban.Core.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ }
+ }
+ },
+ "libraries": {
+ "Luban.DataValidator.Builtin/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "NLog/5.3.4": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-gLy7+O1hEYJXIlcTr1/VWjGXrZTQFZzYNO18IWasD64pNwz0BreV+nHLxWKXWZzERRzoKnsk2XYtwLkTVk7J1A==",
+ "path": "nlog/5.3.4",
+ "hashPath": "nlog.5.3.4.nupkg.sha512"
+ },
+ "Scriban/5.12.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-/YTTCxjBIpfwX3MKMT4JMFVl1jX4IHW7zih+Bg3cTIkzGnbFt+B3l/k90ILDw6DRiFE7T+VxEyls7zk4p029ng==",
+ "path": "scriban/5.12.0",
+ "hashPath": "scriban.5.12.0.nupkg.sha512"
+ },
+ "Luban.Core/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ }
+ }
+}
\ No newline at end of file
diff --git a/Config/Tools/Luban/Luban.DataValidator.Builtin.dll b/Config/Tools/Luban/Luban.DataValidator.Builtin.dll
new file mode 100644
index 0000000..042a0dc
Binary files /dev/null and b/Config/Tools/Luban/Luban.DataValidator.Builtin.dll differ
diff --git a/Config/Tools/Luban/Luban.FlatBuffers.deps.json b/Config/Tools/Luban/Luban.FlatBuffers.deps.json
new file mode 100644
index 0000000..d7e57c1
--- /dev/null
+++ b/Config/Tools/Luban/Luban.FlatBuffers.deps.json
@@ -0,0 +1,581 @@
+{
+ "runtimeTarget": {
+ "name": ".NETCoreApp,Version=v8.0",
+ "signature": ""
+ },
+ "compilationOptions": {},
+ "targets": {
+ ".NETCoreApp,Version=v8.0": {
+ "Luban.FlatBuffers/1.0.0": {
+ "dependencies": {
+ "Luban.Core": "1.0.0",
+ "Luban.DataTarget.Builtin": "1.0.0"
+ },
+ "runtime": {
+ "Luban.FlatBuffers.dll": {}
+ }
+ },
+ "ExcelDataReader/3.7.0": {
+ "runtime": {
+ "lib/netstandard2.1/ExcelDataReader.dll": {
+ "assemblyVersion": "3.7.0.0",
+ "fileVersion": "3.7.0.0"
+ }
+ }
+ },
+ "Microsoft.CSharp/4.5.0": {},
+ "Microsoft.NETCore.Platforms/1.0.1": {},
+ "Microsoft.NETCore.Targets/1.0.1": {},
+ "NeoLua/1.3.14": {
+ "dependencies": {
+ "Microsoft.CSharp": "4.5.0"
+ },
+ "runtime": {
+ "lib/net5.0/Neo.Lua.dll": {
+ "assemblyVersion": "5.3.0.0",
+ "fileVersion": "1.3.14.0"
+ }
+ },
+ "resources": {
+ "lib/net5.0/de/Neo.Lua.resources.dll": {
+ "locale": "de"
+ }
+ }
+ },
+ "NLog/5.3.4": {
+ "runtime": {
+ "lib/netstandard2.0/NLog.dll": {
+ "assemblyVersion": "5.0.0.0",
+ "fileVersion": "5.3.4.2778"
+ }
+ }
+ },
+ "Scriban/5.12.0": {
+ "runtime": {
+ "lib/net7.0/Scriban.dll": {
+ "assemblyVersion": "5.0.0.0",
+ "fileVersion": "5.12.0.0"
+ }
+ }
+ },
+ "System.Collections/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Diagnostics.Debug/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Diagnostics.Tools/4.0.1": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Globalization/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.IO/4.1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Text.Encoding": "4.0.11",
+ "System.Threading.Tasks": "4.0.11"
+ }
+ },
+ "System.Linq/4.1.0": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0"
+ }
+ },
+ "System.Linq.Expressions/4.1.0": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Globalization": "4.0.11",
+ "System.IO": "4.1.0",
+ "System.Linq": "4.1.0",
+ "System.ObjectModel": "4.0.12",
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Emit": "4.0.1",
+ "System.Reflection.Emit.ILGeneration": "4.0.1",
+ "System.Reflection.Emit.Lightweight": "4.0.1",
+ "System.Reflection.Extensions": "4.0.1",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Reflection.TypeExtensions": "4.1.0",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Threading": "4.0.11"
+ }
+ },
+ "System.ObjectModel/4.0.12": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Threading": "4.0.11"
+ }
+ },
+ "System.Reflection/4.1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.IO": "4.1.0",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Emit/4.0.1": {
+ "dependencies": {
+ "System.IO": "4.1.0",
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Emit.ILGeneration": "4.0.1",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Emit.ILGeneration/4.0.1": {
+ "dependencies": {
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Emit.Lightweight/4.0.1": {
+ "dependencies": {
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Emit.ILGeneration": "4.0.1",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Extensions/4.0.1": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Reflection": "4.1.0",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Primitives/4.0.1": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.TypeExtensions/4.1.0": {
+ "dependencies": {
+ "System.Reflection": "4.1.0",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Resources.ResourceManager/4.0.1": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Globalization": "4.0.11",
+ "System.Reflection": "4.1.0",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Runtime/4.1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1"
+ }
+ },
+ "System.Runtime.Extensions/4.1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Runtime.Serialization.Primitives/4.1.1": {
+ "dependencies": {
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Text.Encoding/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Text.Encoding.Extensions/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Text.Encoding": "4.0.11"
+ }
+ },
+ "System.Text.RegularExpressions/4.1.0": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Globalization": "4.0.11",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Threading": "4.0.11"
+ }
+ },
+ "System.Threading/4.0.11": {
+ "dependencies": {
+ "System.Runtime": "4.1.0",
+ "System.Threading.Tasks": "4.0.11"
+ }
+ },
+ "System.Threading.Tasks/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "Ude.NetStandard/1.2.0": {
+ "runtime": {
+ "lib/netstandard2.0/Ude.NetStandard.dll": {
+ "assemblyVersion": "1.0.2.0",
+ "fileVersion": "1.0.2.0"
+ }
+ }
+ },
+ "YamlDotNet.NetCore/1.0.0": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Diagnostics.Tools": "4.0.1",
+ "System.Globalization": "4.0.11",
+ "System.Linq": "4.1.0",
+ "System.Linq.Expressions": "4.1.0",
+ "System.ObjectModel": "4.0.12",
+ "System.Reflection.Extensions": "4.0.1",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Runtime.Serialization.Primitives": "4.1.1",
+ "System.Text.Encoding.Extensions": "4.0.11",
+ "System.Text.RegularExpressions": "4.1.0"
+ },
+ "runtime": {
+ "lib/netstandard1.0/YamlDotNet.NetCore.dll": {
+ "assemblyVersion": "0.0.1.0",
+ "fileVersion": "0.0.0.0"
+ }
+ }
+ },
+ "Luban.Core/1.0.0": {
+ "dependencies": {
+ "NLog": "5.3.4",
+ "Scriban": "5.12.0"
+ },
+ "runtime": {
+ "Luban.Core.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ },
+ "Luban.DataLoader.Builtin/1.0.0": {
+ "dependencies": {
+ "ExcelDataReader": "3.7.0",
+ "Luban.Core": "1.0.0",
+ "NeoLua": "1.3.14",
+ "Ude.NetStandard": "1.2.0",
+ "YamlDotNet.NetCore": "1.0.0"
+ },
+ "runtime": {
+ "Luban.DataLoader.Builtin.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ },
+ "Luban.DataTarget.Builtin/1.0.0": {
+ "dependencies": {
+ "Luban.Core": "1.0.0",
+ "Luban.DataLoader.Builtin": "1.0.0"
+ },
+ "runtime": {
+ "Luban.DataTarget.Builtin.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ }
+ }
+ },
+ "libraries": {
+ "Luban.FlatBuffers/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "ExcelDataReader/3.7.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-AMv3oDETRHSRyXC17rBtKH45qIfFyo433LMeaMB3u4RNr/c9Luuc0Z+JMP6+3Cx9n4wXqFqcrEIVxrf/GgYnZg==",
+ "path": "exceldatareader/3.7.0",
+ "hashPath": "exceldatareader.3.7.0.nupkg.sha512"
+ },
+ "Microsoft.CSharp/4.5.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-kaj6Wb4qoMuH3HySFJhxwQfe8R/sJsNJnANrvv8WdFPMoNbKY5htfNscv+LHCu5ipz+49m2e+WQXpLXr9XYemQ==",
+ "path": "microsoft.csharp/4.5.0",
+ "hashPath": "microsoft.csharp.4.5.0.nupkg.sha512"
+ },
+ "Microsoft.NETCore.Platforms/1.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-2G6OjjJzwBfNOO8myRV/nFrbTw5iA+DEm0N+qUqhrOmaVtn4pC77h38I1jsXGw5VH55+dPfQsqHD0We9sCl9FQ==",
+ "path": "microsoft.netcore.platforms/1.0.1",
+ "hashPath": "microsoft.netcore.platforms.1.0.1.nupkg.sha512"
+ },
+ "Microsoft.NETCore.Targets/1.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-rkn+fKobF/cbWfnnfBOQHKVKIOpxMZBvlSHkqDWgBpwGDcLRduvs3D9OLGeV6GWGvVwNlVi2CBbTjuPmtHvyNw==",
+ "path": "microsoft.netcore.targets/1.0.1",
+ "hashPath": "microsoft.netcore.targets.1.0.1.nupkg.sha512"
+ },
+ "NeoLua/1.3.14": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-BXIUN+ePY2wx3ZGiSmR8KZKD85s01pXI690orrB3u/biB8R0nalziGw+iGbPBq1Cuz8Upggpw2ERF84POXWTCQ==",
+ "path": "neolua/1.3.14",
+ "hashPath": "neolua.1.3.14.nupkg.sha512"
+ },
+ "NLog/5.3.4": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-gLy7+O1hEYJXIlcTr1/VWjGXrZTQFZzYNO18IWasD64pNwz0BreV+nHLxWKXWZzERRzoKnsk2XYtwLkTVk7J1A==",
+ "path": "nlog/5.3.4",
+ "hashPath": "nlog.5.3.4.nupkg.sha512"
+ },
+ "Scriban/5.12.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-/YTTCxjBIpfwX3MKMT4JMFVl1jX4IHW7zih+Bg3cTIkzGnbFt+B3l/k90ILDw6DRiFE7T+VxEyls7zk4p029ng==",
+ "path": "scriban/5.12.0",
+ "hashPath": "scriban.5.12.0.nupkg.sha512"
+ },
+ "System.Collections/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-YUJGz6eFKqS0V//mLt25vFGrrCvOnsXjlvFQs+KimpwNxug9x0Pzy4PlFMU3Q2IzqAa9G2L4LsK3+9vCBK7oTg==",
+ "path": "system.collections/4.0.11",
+ "hashPath": "system.collections.4.0.11.nupkg.sha512"
+ },
+ "System.Diagnostics.Debug/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-w5U95fVKHY4G8ASs/K5iK3J5LY+/dLFd4vKejsnI/ZhBsWS9hQakfx3Zr7lRWKg4tAw9r4iktyvsTagWkqYCiw==",
+ "path": "system.diagnostics.debug/4.0.11",
+ "hashPath": "system.diagnostics.debug.4.0.11.nupkg.sha512"
+ },
+ "System.Diagnostics.Tools/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-xBfJ8pnd4C17dWaC9FM6aShzbJcRNMChUMD42I6772KGGrqaFdumwhn9OdM68erj1ueNo3xdQ1EwiFjK5k8p0g==",
+ "path": "system.diagnostics.tools/4.0.1",
+ "hashPath": "system.diagnostics.tools.4.0.1.nupkg.sha512"
+ },
+ "System.Globalization/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-B95h0YLEL2oSnwF/XjqSWKnwKOy/01VWkNlsCeMTFJLLabflpGV26nK164eRs5GiaRSBGpOxQ3pKoSnnyZN5pg==",
+ "path": "system.globalization/4.0.11",
+ "hashPath": "system.globalization.4.0.11.nupkg.sha512"
+ },
+ "System.IO/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-3KlTJceQc3gnGIaHZ7UBZO26SHL1SHE4ddrmiwumFnId+CEHP+O8r386tZKaE6zlk5/mF8vifMBzHj9SaXN+mQ==",
+ "path": "system.io/4.1.0",
+ "hashPath": "system.io.4.1.0.nupkg.sha512"
+ },
+ "System.Linq/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-bQ0iYFOQI0nuTnt+NQADns6ucV4DUvMdwN6CbkB1yj8i7arTGiTN5eok1kQwdnnNWSDZfIUySQY+J3d5KjWn0g==",
+ "path": "system.linq/4.1.0",
+ "hashPath": "system.linq.4.1.0.nupkg.sha512"
+ },
+ "System.Linq.Expressions/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-I+y02iqkgmCAyfbqOmSDOgqdZQ5tTj80Akm5BPSS8EeB0VGWdy6X1KCoYe8Pk6pwDoAKZUOdLVxnTJcExiv5zw==",
+ "path": "system.linq.expressions/4.1.0",
+ "hashPath": "system.linq.expressions.4.1.0.nupkg.sha512"
+ },
+ "System.ObjectModel/4.0.12": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-tAgJM1xt3ytyMoW4qn4wIqgJYm7L7TShRZG4+Q4Qsi2PCcj96pXN7nRywS9KkB3p/xDUjc2HSwP9SROyPYDYKQ==",
+ "path": "system.objectmodel/4.0.12",
+ "hashPath": "system.objectmodel.4.0.12.nupkg.sha512"
+ },
+ "System.Reflection/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-JCKANJ0TI7kzoQzuwB/OoJANy1Lg338B6+JVacPl4TpUwi3cReg3nMLplMq2uqYfHFQpKIlHAUVAJlImZz/4ng==",
+ "path": "system.reflection/4.1.0",
+ "hashPath": "system.reflection.4.1.0.nupkg.sha512"
+ },
+ "System.Reflection.Emit/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-P2wqAj72fFjpP6wb9nSfDqNBMab+2ovzSDzUZK7MVIm54tBJEPr9jWfSjjoTpPwj1LeKcmX3vr0ttyjSSFM47g==",
+ "path": "system.reflection.emit/4.0.1",
+ "hashPath": "system.reflection.emit.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.Emit.ILGeneration/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-Ov6dU8Bu15Bc7zuqttgHF12J5lwSWyTf1S+FJouUXVMSqImLZzYaQ+vRr1rQ0OZ0HqsrwWl4dsKHELckQkVpgA==",
+ "path": "system.reflection.emit.ilgeneration/4.0.1",
+ "hashPath": "system.reflection.emit.ilgeneration.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.Emit.Lightweight/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-sSzHHXueZ5Uh0OLpUQprhr+ZYJrLPA2Cmr4gn0wj9+FftNKXx8RIMKvO9qnjk2ebPYUjZ+F2ulGdPOsvj+MEjA==",
+ "path": "system.reflection.emit.lightweight/4.0.1",
+ "hashPath": "system.reflection.emit.lightweight.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.Extensions/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-GYrtRsZcMuHF3sbmRHfMYpvxZoIN2bQGrYGerUiWLEkqdEUQZhH3TRSaC/oI4wO0II1RKBPlpIa1TOMxIcOOzQ==",
+ "path": "system.reflection.extensions/4.0.1",
+ "hashPath": "system.reflection.extensions.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.Primitives/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-4inTox4wTBaDhB7V3mPvp9XlCbeGYWVEM9/fXALd52vNEAVisc1BoVWQPuUuD0Ga//dNbA/WeMy9u9mzLxGTHQ==",
+ "path": "system.reflection.primitives/4.0.1",
+ "hashPath": "system.reflection.primitives.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.TypeExtensions/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-tsQ/ptQ3H5FYfON8lL4MxRk/8kFyE0A+tGPXmVP967cT/gzLHYxIejIYSxp4JmIeFHVP78g/F2FE1mUUTbDtrg==",
+ "path": "system.reflection.typeextensions/4.1.0",
+ "hashPath": "system.reflection.typeextensions.4.1.0.nupkg.sha512"
+ },
+ "System.Resources.ResourceManager/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-TxwVeUNoTgUOdQ09gfTjvW411MF+w9MBYL7AtNVc+HtBCFlutPLhUCdZjNkjbhj3bNQWMdHboF0KIWEOjJssbA==",
+ "path": "system.resources.resourcemanager/4.0.1",
+ "hashPath": "system.resources.resourcemanager.4.0.1.nupkg.sha512"
+ },
+ "System.Runtime/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-v6c/4Yaa9uWsq+JMhnOFewrYkgdNHNG2eMKuNqRn8P733rNXeRCGvV5FkkjBXn2dbVkPXOsO0xjsEeM1q2zC0g==",
+ "path": "system.runtime/4.1.0",
+ "hashPath": "system.runtime.4.1.0.nupkg.sha512"
+ },
+ "System.Runtime.Extensions/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-CUOHjTT/vgP0qGW22U4/hDlOqXmcPq5YicBaXdUR2UiUoLwBT+olO6we4DVbq57jeX5uXH2uerVZhf0qGj+sVQ==",
+ "path": "system.runtime.extensions/4.1.0",
+ "hashPath": "system.runtime.extensions.4.1.0.nupkg.sha512"
+ },
+ "System.Runtime.Serialization.Primitives/4.1.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-HZ6Du5QrTG8MNJbf4e4qMO3JRAkIboGT5Fk804uZtg3Gq516S7hAqTm2UZKUHa7/6HUGdVy3AqMQKbns06G/cg==",
+ "path": "system.runtime.serialization.primitives/4.1.1",
+ "hashPath": "system.runtime.serialization.primitives.4.1.1.nupkg.sha512"
+ },
+ "System.Text.Encoding/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-U3gGeMlDZXxCEiY4DwVLSacg+DFWCvoiX+JThA/rvw37Sqrku7sEFeVBBBMBnfB6FeZHsyDx85HlKL19x0HtZA==",
+ "path": "system.text.encoding/4.0.11",
+ "hashPath": "system.text.encoding.4.0.11.nupkg.sha512"
+ },
+ "System.Text.Encoding.Extensions/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-jtbiTDtvfLYgXn8PTfWI+SiBs51rrmO4AAckx4KR6vFK9Wzf6tI8kcRdsYQNwriUeQ1+CtQbM1W4cMbLXnj/OQ==",
+ "path": "system.text.encoding.extensions/4.0.11",
+ "hashPath": "system.text.encoding.extensions.4.0.11.nupkg.sha512"
+ },
+ "System.Text.RegularExpressions/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-i88YCXpRTjCnoSQZtdlHkAOx4KNNik4hMy83n0+Ftlb7jvV6ZiZWMpnEZHhjBp6hQVh8gWd/iKNPzlPF7iyA2g==",
+ "path": "system.text.regularexpressions/4.1.0",
+ "hashPath": "system.text.regularexpressions.4.1.0.nupkg.sha512"
+ },
+ "System.Threading/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-N+3xqIcg3VDKyjwwCGaZ9HawG9aC6cSDI+s7ROma310GQo8vilFZa86hqKppwTHleR/G0sfOzhvgnUxWCR/DrQ==",
+ "path": "system.threading/4.0.11",
+ "hashPath": "system.threading.4.0.11.nupkg.sha512"
+ },
+ "System.Threading.Tasks/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-k1S4Gc6IGwtHGT8188RSeGaX86Qw/wnrgNLshJvsdNUOPP9etMmo8S07c+UlOAx4K/xLuN9ivA1bD0LVurtIxQ==",
+ "path": "system.threading.tasks/4.0.11",
+ "hashPath": "system.threading.tasks.4.0.11.nupkg.sha512"
+ },
+ "Ude.NetStandard/1.2.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-zRWpPAxBg3lNdm4UiKixTe+DFPoNid9CILggTCy/0WR2WKETe17kTWhiiIpLB2k5IEgnvA0QLfKlvd6Tvu0pzA==",
+ "path": "ude.netstandard/1.2.0",
+ "hashPath": "ude.netstandard.1.2.0.nupkg.sha512"
+ },
+ "YamlDotNet.NetCore/1.0.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-vPiKF4Yf02MS96Nzwcr8+WrvlhTx+camOgUzxhazU0hCzs2ESetWDCxaIT/MYdAw2oONYem1ow9PXWJjHkRUDw==",
+ "path": "yamldotnet.netcore/1.0.0",
+ "hashPath": "yamldotnet.netcore.1.0.0.nupkg.sha512"
+ },
+ "Luban.Core/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "Luban.DataLoader.Builtin/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "Luban.DataTarget.Builtin/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ }
+ }
+}
\ No newline at end of file
diff --git a/Config/Tools/Luban/Luban.FlatBuffers.dll b/Config/Tools/Luban/Luban.FlatBuffers.dll
new file mode 100644
index 0000000..e4a892c
Binary files /dev/null and b/Config/Tools/Luban/Luban.FlatBuffers.dll differ
diff --git a/Config/Tools/Luban/Luban.Gdscript.deps.json b/Config/Tools/Luban/Luban.Gdscript.deps.json
new file mode 100644
index 0000000..eec881e
--- /dev/null
+++ b/Config/Tools/Luban/Luban.Gdscript.deps.json
@@ -0,0 +1,581 @@
+{
+ "runtimeTarget": {
+ "name": ".NETCoreApp,Version=v8.0",
+ "signature": ""
+ },
+ "compilationOptions": {},
+ "targets": {
+ ".NETCoreApp,Version=v8.0": {
+ "Luban.Gdscript/1.0.0": {
+ "dependencies": {
+ "Luban.Core": "1.0.0",
+ "Luban.DataTarget.Builtin": "1.0.0"
+ },
+ "runtime": {
+ "Luban.Gdscript.dll": {}
+ }
+ },
+ "ExcelDataReader/3.7.0": {
+ "runtime": {
+ "lib/netstandard2.1/ExcelDataReader.dll": {
+ "assemblyVersion": "3.7.0.0",
+ "fileVersion": "3.7.0.0"
+ }
+ }
+ },
+ "Microsoft.CSharp/4.5.0": {},
+ "Microsoft.NETCore.Platforms/1.0.1": {},
+ "Microsoft.NETCore.Targets/1.0.1": {},
+ "NeoLua/1.3.14": {
+ "dependencies": {
+ "Microsoft.CSharp": "4.5.0"
+ },
+ "runtime": {
+ "lib/net5.0/Neo.Lua.dll": {
+ "assemblyVersion": "5.3.0.0",
+ "fileVersion": "1.3.14.0"
+ }
+ },
+ "resources": {
+ "lib/net5.0/de/Neo.Lua.resources.dll": {
+ "locale": "de"
+ }
+ }
+ },
+ "NLog/5.3.4": {
+ "runtime": {
+ "lib/netstandard2.0/NLog.dll": {
+ "assemblyVersion": "5.0.0.0",
+ "fileVersion": "5.3.4.2778"
+ }
+ }
+ },
+ "Scriban/5.12.0": {
+ "runtime": {
+ "lib/net7.0/Scriban.dll": {
+ "assemblyVersion": "5.0.0.0",
+ "fileVersion": "5.12.0.0"
+ }
+ }
+ },
+ "System.Collections/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Diagnostics.Debug/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Diagnostics.Tools/4.0.1": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Globalization/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.IO/4.1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Text.Encoding": "4.0.11",
+ "System.Threading.Tasks": "4.0.11"
+ }
+ },
+ "System.Linq/4.1.0": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0"
+ }
+ },
+ "System.Linq.Expressions/4.1.0": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Globalization": "4.0.11",
+ "System.IO": "4.1.0",
+ "System.Linq": "4.1.0",
+ "System.ObjectModel": "4.0.12",
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Emit": "4.0.1",
+ "System.Reflection.Emit.ILGeneration": "4.0.1",
+ "System.Reflection.Emit.Lightweight": "4.0.1",
+ "System.Reflection.Extensions": "4.0.1",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Reflection.TypeExtensions": "4.1.0",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Threading": "4.0.11"
+ }
+ },
+ "System.ObjectModel/4.0.12": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Threading": "4.0.11"
+ }
+ },
+ "System.Reflection/4.1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.IO": "4.1.0",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Emit/4.0.1": {
+ "dependencies": {
+ "System.IO": "4.1.0",
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Emit.ILGeneration": "4.0.1",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Emit.ILGeneration/4.0.1": {
+ "dependencies": {
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Emit.Lightweight/4.0.1": {
+ "dependencies": {
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Emit.ILGeneration": "4.0.1",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Extensions/4.0.1": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Reflection": "4.1.0",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Primitives/4.0.1": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.TypeExtensions/4.1.0": {
+ "dependencies": {
+ "System.Reflection": "4.1.0",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Resources.ResourceManager/4.0.1": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Globalization": "4.0.11",
+ "System.Reflection": "4.1.0",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Runtime/4.1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1"
+ }
+ },
+ "System.Runtime.Extensions/4.1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Runtime.Serialization.Primitives/4.1.1": {
+ "dependencies": {
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Text.Encoding/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Text.Encoding.Extensions/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Text.Encoding": "4.0.11"
+ }
+ },
+ "System.Text.RegularExpressions/4.1.0": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Globalization": "4.0.11",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Threading": "4.0.11"
+ }
+ },
+ "System.Threading/4.0.11": {
+ "dependencies": {
+ "System.Runtime": "4.1.0",
+ "System.Threading.Tasks": "4.0.11"
+ }
+ },
+ "System.Threading.Tasks/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "Ude.NetStandard/1.2.0": {
+ "runtime": {
+ "lib/netstandard2.0/Ude.NetStandard.dll": {
+ "assemblyVersion": "1.0.2.0",
+ "fileVersion": "1.0.2.0"
+ }
+ }
+ },
+ "YamlDotNet.NetCore/1.0.0": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Diagnostics.Tools": "4.0.1",
+ "System.Globalization": "4.0.11",
+ "System.Linq": "4.1.0",
+ "System.Linq.Expressions": "4.1.0",
+ "System.ObjectModel": "4.0.12",
+ "System.Reflection.Extensions": "4.0.1",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Runtime.Serialization.Primitives": "4.1.1",
+ "System.Text.Encoding.Extensions": "4.0.11",
+ "System.Text.RegularExpressions": "4.1.0"
+ },
+ "runtime": {
+ "lib/netstandard1.0/YamlDotNet.NetCore.dll": {
+ "assemblyVersion": "0.0.1.0",
+ "fileVersion": "0.0.0.0"
+ }
+ }
+ },
+ "Luban.Core/1.0.0": {
+ "dependencies": {
+ "NLog": "5.3.4",
+ "Scriban": "5.12.0"
+ },
+ "runtime": {
+ "Luban.Core.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ },
+ "Luban.DataLoader.Builtin/1.0.0": {
+ "dependencies": {
+ "ExcelDataReader": "3.7.0",
+ "Luban.Core": "1.0.0",
+ "NeoLua": "1.3.14",
+ "Ude.NetStandard": "1.2.0",
+ "YamlDotNet.NetCore": "1.0.0"
+ },
+ "runtime": {
+ "Luban.DataLoader.Builtin.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ },
+ "Luban.DataTarget.Builtin/1.0.0": {
+ "dependencies": {
+ "Luban.Core": "1.0.0",
+ "Luban.DataLoader.Builtin": "1.0.0"
+ },
+ "runtime": {
+ "Luban.DataTarget.Builtin.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ }
+ }
+ },
+ "libraries": {
+ "Luban.Gdscript/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "ExcelDataReader/3.7.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-AMv3oDETRHSRyXC17rBtKH45qIfFyo433LMeaMB3u4RNr/c9Luuc0Z+JMP6+3Cx9n4wXqFqcrEIVxrf/GgYnZg==",
+ "path": "exceldatareader/3.7.0",
+ "hashPath": "exceldatareader.3.7.0.nupkg.sha512"
+ },
+ "Microsoft.CSharp/4.5.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-kaj6Wb4qoMuH3HySFJhxwQfe8R/sJsNJnANrvv8WdFPMoNbKY5htfNscv+LHCu5ipz+49m2e+WQXpLXr9XYemQ==",
+ "path": "microsoft.csharp/4.5.0",
+ "hashPath": "microsoft.csharp.4.5.0.nupkg.sha512"
+ },
+ "Microsoft.NETCore.Platforms/1.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-2G6OjjJzwBfNOO8myRV/nFrbTw5iA+DEm0N+qUqhrOmaVtn4pC77h38I1jsXGw5VH55+dPfQsqHD0We9sCl9FQ==",
+ "path": "microsoft.netcore.platforms/1.0.1",
+ "hashPath": "microsoft.netcore.platforms.1.0.1.nupkg.sha512"
+ },
+ "Microsoft.NETCore.Targets/1.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-rkn+fKobF/cbWfnnfBOQHKVKIOpxMZBvlSHkqDWgBpwGDcLRduvs3D9OLGeV6GWGvVwNlVi2CBbTjuPmtHvyNw==",
+ "path": "microsoft.netcore.targets/1.0.1",
+ "hashPath": "microsoft.netcore.targets.1.0.1.nupkg.sha512"
+ },
+ "NeoLua/1.3.14": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-BXIUN+ePY2wx3ZGiSmR8KZKD85s01pXI690orrB3u/biB8R0nalziGw+iGbPBq1Cuz8Upggpw2ERF84POXWTCQ==",
+ "path": "neolua/1.3.14",
+ "hashPath": "neolua.1.3.14.nupkg.sha512"
+ },
+ "NLog/5.3.4": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-gLy7+O1hEYJXIlcTr1/VWjGXrZTQFZzYNO18IWasD64pNwz0BreV+nHLxWKXWZzERRzoKnsk2XYtwLkTVk7J1A==",
+ "path": "nlog/5.3.4",
+ "hashPath": "nlog.5.3.4.nupkg.sha512"
+ },
+ "Scriban/5.12.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-/YTTCxjBIpfwX3MKMT4JMFVl1jX4IHW7zih+Bg3cTIkzGnbFt+B3l/k90ILDw6DRiFE7T+VxEyls7zk4p029ng==",
+ "path": "scriban/5.12.0",
+ "hashPath": "scriban.5.12.0.nupkg.sha512"
+ },
+ "System.Collections/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-YUJGz6eFKqS0V//mLt25vFGrrCvOnsXjlvFQs+KimpwNxug9x0Pzy4PlFMU3Q2IzqAa9G2L4LsK3+9vCBK7oTg==",
+ "path": "system.collections/4.0.11",
+ "hashPath": "system.collections.4.0.11.nupkg.sha512"
+ },
+ "System.Diagnostics.Debug/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-w5U95fVKHY4G8ASs/K5iK3J5LY+/dLFd4vKejsnI/ZhBsWS9hQakfx3Zr7lRWKg4tAw9r4iktyvsTagWkqYCiw==",
+ "path": "system.diagnostics.debug/4.0.11",
+ "hashPath": "system.diagnostics.debug.4.0.11.nupkg.sha512"
+ },
+ "System.Diagnostics.Tools/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-xBfJ8pnd4C17dWaC9FM6aShzbJcRNMChUMD42I6772KGGrqaFdumwhn9OdM68erj1ueNo3xdQ1EwiFjK5k8p0g==",
+ "path": "system.diagnostics.tools/4.0.1",
+ "hashPath": "system.diagnostics.tools.4.0.1.nupkg.sha512"
+ },
+ "System.Globalization/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-B95h0YLEL2oSnwF/XjqSWKnwKOy/01VWkNlsCeMTFJLLabflpGV26nK164eRs5GiaRSBGpOxQ3pKoSnnyZN5pg==",
+ "path": "system.globalization/4.0.11",
+ "hashPath": "system.globalization.4.0.11.nupkg.sha512"
+ },
+ "System.IO/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-3KlTJceQc3gnGIaHZ7UBZO26SHL1SHE4ddrmiwumFnId+CEHP+O8r386tZKaE6zlk5/mF8vifMBzHj9SaXN+mQ==",
+ "path": "system.io/4.1.0",
+ "hashPath": "system.io.4.1.0.nupkg.sha512"
+ },
+ "System.Linq/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-bQ0iYFOQI0nuTnt+NQADns6ucV4DUvMdwN6CbkB1yj8i7arTGiTN5eok1kQwdnnNWSDZfIUySQY+J3d5KjWn0g==",
+ "path": "system.linq/4.1.0",
+ "hashPath": "system.linq.4.1.0.nupkg.sha512"
+ },
+ "System.Linq.Expressions/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-I+y02iqkgmCAyfbqOmSDOgqdZQ5tTj80Akm5BPSS8EeB0VGWdy6X1KCoYe8Pk6pwDoAKZUOdLVxnTJcExiv5zw==",
+ "path": "system.linq.expressions/4.1.0",
+ "hashPath": "system.linq.expressions.4.1.0.nupkg.sha512"
+ },
+ "System.ObjectModel/4.0.12": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-tAgJM1xt3ytyMoW4qn4wIqgJYm7L7TShRZG4+Q4Qsi2PCcj96pXN7nRywS9KkB3p/xDUjc2HSwP9SROyPYDYKQ==",
+ "path": "system.objectmodel/4.0.12",
+ "hashPath": "system.objectmodel.4.0.12.nupkg.sha512"
+ },
+ "System.Reflection/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-JCKANJ0TI7kzoQzuwB/OoJANy1Lg338B6+JVacPl4TpUwi3cReg3nMLplMq2uqYfHFQpKIlHAUVAJlImZz/4ng==",
+ "path": "system.reflection/4.1.0",
+ "hashPath": "system.reflection.4.1.0.nupkg.sha512"
+ },
+ "System.Reflection.Emit/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-P2wqAj72fFjpP6wb9nSfDqNBMab+2ovzSDzUZK7MVIm54tBJEPr9jWfSjjoTpPwj1LeKcmX3vr0ttyjSSFM47g==",
+ "path": "system.reflection.emit/4.0.1",
+ "hashPath": "system.reflection.emit.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.Emit.ILGeneration/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-Ov6dU8Bu15Bc7zuqttgHF12J5lwSWyTf1S+FJouUXVMSqImLZzYaQ+vRr1rQ0OZ0HqsrwWl4dsKHELckQkVpgA==",
+ "path": "system.reflection.emit.ilgeneration/4.0.1",
+ "hashPath": "system.reflection.emit.ilgeneration.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.Emit.Lightweight/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-sSzHHXueZ5Uh0OLpUQprhr+ZYJrLPA2Cmr4gn0wj9+FftNKXx8RIMKvO9qnjk2ebPYUjZ+F2ulGdPOsvj+MEjA==",
+ "path": "system.reflection.emit.lightweight/4.0.1",
+ "hashPath": "system.reflection.emit.lightweight.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.Extensions/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-GYrtRsZcMuHF3sbmRHfMYpvxZoIN2bQGrYGerUiWLEkqdEUQZhH3TRSaC/oI4wO0II1RKBPlpIa1TOMxIcOOzQ==",
+ "path": "system.reflection.extensions/4.0.1",
+ "hashPath": "system.reflection.extensions.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.Primitives/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-4inTox4wTBaDhB7V3mPvp9XlCbeGYWVEM9/fXALd52vNEAVisc1BoVWQPuUuD0Ga//dNbA/WeMy9u9mzLxGTHQ==",
+ "path": "system.reflection.primitives/4.0.1",
+ "hashPath": "system.reflection.primitives.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.TypeExtensions/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-tsQ/ptQ3H5FYfON8lL4MxRk/8kFyE0A+tGPXmVP967cT/gzLHYxIejIYSxp4JmIeFHVP78g/F2FE1mUUTbDtrg==",
+ "path": "system.reflection.typeextensions/4.1.0",
+ "hashPath": "system.reflection.typeextensions.4.1.0.nupkg.sha512"
+ },
+ "System.Resources.ResourceManager/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-TxwVeUNoTgUOdQ09gfTjvW411MF+w9MBYL7AtNVc+HtBCFlutPLhUCdZjNkjbhj3bNQWMdHboF0KIWEOjJssbA==",
+ "path": "system.resources.resourcemanager/4.0.1",
+ "hashPath": "system.resources.resourcemanager.4.0.1.nupkg.sha512"
+ },
+ "System.Runtime/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-v6c/4Yaa9uWsq+JMhnOFewrYkgdNHNG2eMKuNqRn8P733rNXeRCGvV5FkkjBXn2dbVkPXOsO0xjsEeM1q2zC0g==",
+ "path": "system.runtime/4.1.0",
+ "hashPath": "system.runtime.4.1.0.nupkg.sha512"
+ },
+ "System.Runtime.Extensions/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-CUOHjTT/vgP0qGW22U4/hDlOqXmcPq5YicBaXdUR2UiUoLwBT+olO6we4DVbq57jeX5uXH2uerVZhf0qGj+sVQ==",
+ "path": "system.runtime.extensions/4.1.0",
+ "hashPath": "system.runtime.extensions.4.1.0.nupkg.sha512"
+ },
+ "System.Runtime.Serialization.Primitives/4.1.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-HZ6Du5QrTG8MNJbf4e4qMO3JRAkIboGT5Fk804uZtg3Gq516S7hAqTm2UZKUHa7/6HUGdVy3AqMQKbns06G/cg==",
+ "path": "system.runtime.serialization.primitives/4.1.1",
+ "hashPath": "system.runtime.serialization.primitives.4.1.1.nupkg.sha512"
+ },
+ "System.Text.Encoding/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-U3gGeMlDZXxCEiY4DwVLSacg+DFWCvoiX+JThA/rvw37Sqrku7sEFeVBBBMBnfB6FeZHsyDx85HlKL19x0HtZA==",
+ "path": "system.text.encoding/4.0.11",
+ "hashPath": "system.text.encoding.4.0.11.nupkg.sha512"
+ },
+ "System.Text.Encoding.Extensions/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-jtbiTDtvfLYgXn8PTfWI+SiBs51rrmO4AAckx4KR6vFK9Wzf6tI8kcRdsYQNwriUeQ1+CtQbM1W4cMbLXnj/OQ==",
+ "path": "system.text.encoding.extensions/4.0.11",
+ "hashPath": "system.text.encoding.extensions.4.0.11.nupkg.sha512"
+ },
+ "System.Text.RegularExpressions/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-i88YCXpRTjCnoSQZtdlHkAOx4KNNik4hMy83n0+Ftlb7jvV6ZiZWMpnEZHhjBp6hQVh8gWd/iKNPzlPF7iyA2g==",
+ "path": "system.text.regularexpressions/4.1.0",
+ "hashPath": "system.text.regularexpressions.4.1.0.nupkg.sha512"
+ },
+ "System.Threading/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-N+3xqIcg3VDKyjwwCGaZ9HawG9aC6cSDI+s7ROma310GQo8vilFZa86hqKppwTHleR/G0sfOzhvgnUxWCR/DrQ==",
+ "path": "system.threading/4.0.11",
+ "hashPath": "system.threading.4.0.11.nupkg.sha512"
+ },
+ "System.Threading.Tasks/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-k1S4Gc6IGwtHGT8188RSeGaX86Qw/wnrgNLshJvsdNUOPP9etMmo8S07c+UlOAx4K/xLuN9ivA1bD0LVurtIxQ==",
+ "path": "system.threading.tasks/4.0.11",
+ "hashPath": "system.threading.tasks.4.0.11.nupkg.sha512"
+ },
+ "Ude.NetStandard/1.2.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-zRWpPAxBg3lNdm4UiKixTe+DFPoNid9CILggTCy/0WR2WKETe17kTWhiiIpLB2k5IEgnvA0QLfKlvd6Tvu0pzA==",
+ "path": "ude.netstandard/1.2.0",
+ "hashPath": "ude.netstandard.1.2.0.nupkg.sha512"
+ },
+ "YamlDotNet.NetCore/1.0.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-vPiKF4Yf02MS96Nzwcr8+WrvlhTx+camOgUzxhazU0hCzs2ESetWDCxaIT/MYdAw2oONYem1ow9PXWJjHkRUDw==",
+ "path": "yamldotnet.netcore/1.0.0",
+ "hashPath": "yamldotnet.netcore.1.0.0.nupkg.sha512"
+ },
+ "Luban.Core/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "Luban.DataLoader.Builtin/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "Luban.DataTarget.Builtin/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ }
+ }
+}
\ No newline at end of file
diff --git a/Config/Tools/Luban/Luban.Gdscript.dll b/Config/Tools/Luban/Luban.Gdscript.dll
new file mode 100644
index 0000000..852ddb3
Binary files /dev/null and b/Config/Tools/Luban/Luban.Gdscript.dll differ
diff --git a/Config/Tools/Luban/Luban.Golang.deps.json b/Config/Tools/Luban/Luban.Golang.deps.json
new file mode 100644
index 0000000..eb35788
--- /dev/null
+++ b/Config/Tools/Luban/Luban.Golang.deps.json
@@ -0,0 +1,73 @@
+{
+ "runtimeTarget": {
+ "name": ".NETCoreApp,Version=v8.0",
+ "signature": ""
+ },
+ "compilationOptions": {},
+ "targets": {
+ ".NETCoreApp,Version=v8.0": {
+ "Luban.Golang/1.0.0": {
+ "dependencies": {
+ "Luban.Core": "1.0.0"
+ },
+ "runtime": {
+ "Luban.Golang.dll": {}
+ }
+ },
+ "NLog/5.3.4": {
+ "runtime": {
+ "lib/netstandard2.0/NLog.dll": {
+ "assemblyVersion": "5.0.0.0",
+ "fileVersion": "5.3.4.2778"
+ }
+ }
+ },
+ "Scriban/5.12.0": {
+ "runtime": {
+ "lib/net7.0/Scriban.dll": {
+ "assemblyVersion": "5.0.0.0",
+ "fileVersion": "5.12.0.0"
+ }
+ }
+ },
+ "Luban.Core/1.0.0": {
+ "dependencies": {
+ "NLog": "5.3.4",
+ "Scriban": "5.12.0"
+ },
+ "runtime": {
+ "Luban.Core.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ }
+ }
+ },
+ "libraries": {
+ "Luban.Golang/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "NLog/5.3.4": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-gLy7+O1hEYJXIlcTr1/VWjGXrZTQFZzYNO18IWasD64pNwz0BreV+nHLxWKXWZzERRzoKnsk2XYtwLkTVk7J1A==",
+ "path": "nlog/5.3.4",
+ "hashPath": "nlog.5.3.4.nupkg.sha512"
+ },
+ "Scriban/5.12.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-/YTTCxjBIpfwX3MKMT4JMFVl1jX4IHW7zih+Bg3cTIkzGnbFt+B3l/k90ILDw6DRiFE7T+VxEyls7zk4p029ng==",
+ "path": "scriban/5.12.0",
+ "hashPath": "scriban.5.12.0.nupkg.sha512"
+ },
+ "Luban.Core/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ }
+ }
+}
\ No newline at end of file
diff --git a/Config/Tools/Luban/Luban.Golang.dll b/Config/Tools/Luban/Luban.Golang.dll
new file mode 100644
index 0000000..bd60062
Binary files /dev/null and b/Config/Tools/Luban/Luban.Golang.dll differ
diff --git a/Config/Tools/Luban/Luban.Java.deps.json b/Config/Tools/Luban/Luban.Java.deps.json
new file mode 100644
index 0000000..83a9ec0
--- /dev/null
+++ b/Config/Tools/Luban/Luban.Java.deps.json
@@ -0,0 +1,73 @@
+{
+ "runtimeTarget": {
+ "name": ".NETCoreApp,Version=v8.0",
+ "signature": ""
+ },
+ "compilationOptions": {},
+ "targets": {
+ ".NETCoreApp,Version=v8.0": {
+ "Luban.Java/1.0.0": {
+ "dependencies": {
+ "Luban.Core": "1.0.0"
+ },
+ "runtime": {
+ "Luban.Java.dll": {}
+ }
+ },
+ "NLog/5.3.4": {
+ "runtime": {
+ "lib/netstandard2.0/NLog.dll": {
+ "assemblyVersion": "5.0.0.0",
+ "fileVersion": "5.3.4.2778"
+ }
+ }
+ },
+ "Scriban/5.12.0": {
+ "runtime": {
+ "lib/net7.0/Scriban.dll": {
+ "assemblyVersion": "5.0.0.0",
+ "fileVersion": "5.12.0.0"
+ }
+ }
+ },
+ "Luban.Core/1.0.0": {
+ "dependencies": {
+ "NLog": "5.3.4",
+ "Scriban": "5.12.0"
+ },
+ "runtime": {
+ "Luban.Core.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ }
+ }
+ },
+ "libraries": {
+ "Luban.Java/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "NLog/5.3.4": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-gLy7+O1hEYJXIlcTr1/VWjGXrZTQFZzYNO18IWasD64pNwz0BreV+nHLxWKXWZzERRzoKnsk2XYtwLkTVk7J1A==",
+ "path": "nlog/5.3.4",
+ "hashPath": "nlog.5.3.4.nupkg.sha512"
+ },
+ "Scriban/5.12.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-/YTTCxjBIpfwX3MKMT4JMFVl1jX4IHW7zih+Bg3cTIkzGnbFt+B3l/k90ILDw6DRiFE7T+VxEyls7zk4p029ng==",
+ "path": "scriban/5.12.0",
+ "hashPath": "scriban.5.12.0.nupkg.sha512"
+ },
+ "Luban.Core/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ }
+ }
+}
\ No newline at end of file
diff --git a/Config/Tools/Luban/Luban.Java.dll b/Config/Tools/Luban/Luban.Java.dll
new file mode 100644
index 0000000..19dd460
Binary files /dev/null and b/Config/Tools/Luban/Luban.Java.dll differ
diff --git a/Config/Tools/Luban/Luban.L10N.deps.json b/Config/Tools/Luban/Luban.L10N.deps.json
new file mode 100644
index 0000000..605a603
--- /dev/null
+++ b/Config/Tools/Luban/Luban.L10N.deps.json
@@ -0,0 +1,564 @@
+{
+ "runtimeTarget": {
+ "name": ".NETCoreApp,Version=v8.0",
+ "signature": ""
+ },
+ "compilationOptions": {},
+ "targets": {
+ ".NETCoreApp,Version=v8.0": {
+ "Luban.L10N/1.0.0": {
+ "dependencies": {
+ "Luban.Core": "1.0.0",
+ "Luban.DataLoader.Builtin": "1.0.0"
+ },
+ "runtime": {
+ "Luban.L10N.dll": {}
+ }
+ },
+ "ExcelDataReader/3.7.0": {
+ "runtime": {
+ "lib/netstandard2.1/ExcelDataReader.dll": {
+ "assemblyVersion": "3.7.0.0",
+ "fileVersion": "3.7.0.0"
+ }
+ }
+ },
+ "Microsoft.CSharp/4.5.0": {},
+ "Microsoft.NETCore.Platforms/1.0.1": {},
+ "Microsoft.NETCore.Targets/1.0.1": {},
+ "NeoLua/1.3.14": {
+ "dependencies": {
+ "Microsoft.CSharp": "4.5.0"
+ },
+ "runtime": {
+ "lib/net5.0/Neo.Lua.dll": {
+ "assemblyVersion": "5.3.0.0",
+ "fileVersion": "1.3.14.0"
+ }
+ },
+ "resources": {
+ "lib/net5.0/de/Neo.Lua.resources.dll": {
+ "locale": "de"
+ }
+ }
+ },
+ "NLog/5.3.4": {
+ "runtime": {
+ "lib/netstandard2.0/NLog.dll": {
+ "assemblyVersion": "5.0.0.0",
+ "fileVersion": "5.3.4.2778"
+ }
+ }
+ },
+ "Scriban/5.12.0": {
+ "runtime": {
+ "lib/net7.0/Scriban.dll": {
+ "assemblyVersion": "5.0.0.0",
+ "fileVersion": "5.12.0.0"
+ }
+ }
+ },
+ "System.Collections/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Diagnostics.Debug/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Diagnostics.Tools/4.0.1": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Globalization/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.IO/4.1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Text.Encoding": "4.0.11",
+ "System.Threading.Tasks": "4.0.11"
+ }
+ },
+ "System.Linq/4.1.0": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0"
+ }
+ },
+ "System.Linq.Expressions/4.1.0": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Globalization": "4.0.11",
+ "System.IO": "4.1.0",
+ "System.Linq": "4.1.0",
+ "System.ObjectModel": "4.0.12",
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Emit": "4.0.1",
+ "System.Reflection.Emit.ILGeneration": "4.0.1",
+ "System.Reflection.Emit.Lightweight": "4.0.1",
+ "System.Reflection.Extensions": "4.0.1",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Reflection.TypeExtensions": "4.1.0",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Threading": "4.0.11"
+ }
+ },
+ "System.ObjectModel/4.0.12": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Threading": "4.0.11"
+ }
+ },
+ "System.Reflection/4.1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.IO": "4.1.0",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Emit/4.0.1": {
+ "dependencies": {
+ "System.IO": "4.1.0",
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Emit.ILGeneration": "4.0.1",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Emit.ILGeneration/4.0.1": {
+ "dependencies": {
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Emit.Lightweight/4.0.1": {
+ "dependencies": {
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Emit.ILGeneration": "4.0.1",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Extensions/4.0.1": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Reflection": "4.1.0",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Primitives/4.0.1": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.TypeExtensions/4.1.0": {
+ "dependencies": {
+ "System.Reflection": "4.1.0",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Resources.ResourceManager/4.0.1": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Globalization": "4.0.11",
+ "System.Reflection": "4.1.0",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Runtime/4.1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1"
+ }
+ },
+ "System.Runtime.Extensions/4.1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Runtime.Serialization.Primitives/4.1.1": {
+ "dependencies": {
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Text.Encoding/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Text.Encoding.Extensions/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Text.Encoding": "4.0.11"
+ }
+ },
+ "System.Text.RegularExpressions/4.1.0": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Globalization": "4.0.11",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Threading": "4.0.11"
+ }
+ },
+ "System.Threading/4.0.11": {
+ "dependencies": {
+ "System.Runtime": "4.1.0",
+ "System.Threading.Tasks": "4.0.11"
+ }
+ },
+ "System.Threading.Tasks/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "Ude.NetStandard/1.2.0": {
+ "runtime": {
+ "lib/netstandard2.0/Ude.NetStandard.dll": {
+ "assemblyVersion": "1.0.2.0",
+ "fileVersion": "1.0.2.0"
+ }
+ }
+ },
+ "YamlDotNet.NetCore/1.0.0": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Diagnostics.Tools": "4.0.1",
+ "System.Globalization": "4.0.11",
+ "System.Linq": "4.1.0",
+ "System.Linq.Expressions": "4.1.0",
+ "System.ObjectModel": "4.0.12",
+ "System.Reflection.Extensions": "4.0.1",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Runtime.Serialization.Primitives": "4.1.1",
+ "System.Text.Encoding.Extensions": "4.0.11",
+ "System.Text.RegularExpressions": "4.1.0"
+ },
+ "runtime": {
+ "lib/netstandard1.0/YamlDotNet.NetCore.dll": {
+ "assemblyVersion": "0.0.1.0",
+ "fileVersion": "0.0.0.0"
+ }
+ }
+ },
+ "Luban.Core/1.0.0": {
+ "dependencies": {
+ "NLog": "5.3.4",
+ "Scriban": "5.12.0"
+ },
+ "runtime": {
+ "Luban.Core.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ },
+ "Luban.DataLoader.Builtin/1.0.0": {
+ "dependencies": {
+ "ExcelDataReader": "3.7.0",
+ "Luban.Core": "1.0.0",
+ "NeoLua": "1.3.14",
+ "Ude.NetStandard": "1.2.0",
+ "YamlDotNet.NetCore": "1.0.0"
+ },
+ "runtime": {
+ "Luban.DataLoader.Builtin.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ }
+ }
+ },
+ "libraries": {
+ "Luban.L10N/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "ExcelDataReader/3.7.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-AMv3oDETRHSRyXC17rBtKH45qIfFyo433LMeaMB3u4RNr/c9Luuc0Z+JMP6+3Cx9n4wXqFqcrEIVxrf/GgYnZg==",
+ "path": "exceldatareader/3.7.0",
+ "hashPath": "exceldatareader.3.7.0.nupkg.sha512"
+ },
+ "Microsoft.CSharp/4.5.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-kaj6Wb4qoMuH3HySFJhxwQfe8R/sJsNJnANrvv8WdFPMoNbKY5htfNscv+LHCu5ipz+49m2e+WQXpLXr9XYemQ==",
+ "path": "microsoft.csharp/4.5.0",
+ "hashPath": "microsoft.csharp.4.5.0.nupkg.sha512"
+ },
+ "Microsoft.NETCore.Platforms/1.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-2G6OjjJzwBfNOO8myRV/nFrbTw5iA+DEm0N+qUqhrOmaVtn4pC77h38I1jsXGw5VH55+dPfQsqHD0We9sCl9FQ==",
+ "path": "microsoft.netcore.platforms/1.0.1",
+ "hashPath": "microsoft.netcore.platforms.1.0.1.nupkg.sha512"
+ },
+ "Microsoft.NETCore.Targets/1.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-rkn+fKobF/cbWfnnfBOQHKVKIOpxMZBvlSHkqDWgBpwGDcLRduvs3D9OLGeV6GWGvVwNlVi2CBbTjuPmtHvyNw==",
+ "path": "microsoft.netcore.targets/1.0.1",
+ "hashPath": "microsoft.netcore.targets.1.0.1.nupkg.sha512"
+ },
+ "NeoLua/1.3.14": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-BXIUN+ePY2wx3ZGiSmR8KZKD85s01pXI690orrB3u/biB8R0nalziGw+iGbPBq1Cuz8Upggpw2ERF84POXWTCQ==",
+ "path": "neolua/1.3.14",
+ "hashPath": "neolua.1.3.14.nupkg.sha512"
+ },
+ "NLog/5.3.4": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-gLy7+O1hEYJXIlcTr1/VWjGXrZTQFZzYNO18IWasD64pNwz0BreV+nHLxWKXWZzERRzoKnsk2XYtwLkTVk7J1A==",
+ "path": "nlog/5.3.4",
+ "hashPath": "nlog.5.3.4.nupkg.sha512"
+ },
+ "Scriban/5.12.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-/YTTCxjBIpfwX3MKMT4JMFVl1jX4IHW7zih+Bg3cTIkzGnbFt+B3l/k90ILDw6DRiFE7T+VxEyls7zk4p029ng==",
+ "path": "scriban/5.12.0",
+ "hashPath": "scriban.5.12.0.nupkg.sha512"
+ },
+ "System.Collections/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-YUJGz6eFKqS0V//mLt25vFGrrCvOnsXjlvFQs+KimpwNxug9x0Pzy4PlFMU3Q2IzqAa9G2L4LsK3+9vCBK7oTg==",
+ "path": "system.collections/4.0.11",
+ "hashPath": "system.collections.4.0.11.nupkg.sha512"
+ },
+ "System.Diagnostics.Debug/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-w5U95fVKHY4G8ASs/K5iK3J5LY+/dLFd4vKejsnI/ZhBsWS9hQakfx3Zr7lRWKg4tAw9r4iktyvsTagWkqYCiw==",
+ "path": "system.diagnostics.debug/4.0.11",
+ "hashPath": "system.diagnostics.debug.4.0.11.nupkg.sha512"
+ },
+ "System.Diagnostics.Tools/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-xBfJ8pnd4C17dWaC9FM6aShzbJcRNMChUMD42I6772KGGrqaFdumwhn9OdM68erj1ueNo3xdQ1EwiFjK5k8p0g==",
+ "path": "system.diagnostics.tools/4.0.1",
+ "hashPath": "system.diagnostics.tools.4.0.1.nupkg.sha512"
+ },
+ "System.Globalization/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-B95h0YLEL2oSnwF/XjqSWKnwKOy/01VWkNlsCeMTFJLLabflpGV26nK164eRs5GiaRSBGpOxQ3pKoSnnyZN5pg==",
+ "path": "system.globalization/4.0.11",
+ "hashPath": "system.globalization.4.0.11.nupkg.sha512"
+ },
+ "System.IO/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-3KlTJceQc3gnGIaHZ7UBZO26SHL1SHE4ddrmiwumFnId+CEHP+O8r386tZKaE6zlk5/mF8vifMBzHj9SaXN+mQ==",
+ "path": "system.io/4.1.0",
+ "hashPath": "system.io.4.1.0.nupkg.sha512"
+ },
+ "System.Linq/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-bQ0iYFOQI0nuTnt+NQADns6ucV4DUvMdwN6CbkB1yj8i7arTGiTN5eok1kQwdnnNWSDZfIUySQY+J3d5KjWn0g==",
+ "path": "system.linq/4.1.0",
+ "hashPath": "system.linq.4.1.0.nupkg.sha512"
+ },
+ "System.Linq.Expressions/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-I+y02iqkgmCAyfbqOmSDOgqdZQ5tTj80Akm5BPSS8EeB0VGWdy6X1KCoYe8Pk6pwDoAKZUOdLVxnTJcExiv5zw==",
+ "path": "system.linq.expressions/4.1.0",
+ "hashPath": "system.linq.expressions.4.1.0.nupkg.sha512"
+ },
+ "System.ObjectModel/4.0.12": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-tAgJM1xt3ytyMoW4qn4wIqgJYm7L7TShRZG4+Q4Qsi2PCcj96pXN7nRywS9KkB3p/xDUjc2HSwP9SROyPYDYKQ==",
+ "path": "system.objectmodel/4.0.12",
+ "hashPath": "system.objectmodel.4.0.12.nupkg.sha512"
+ },
+ "System.Reflection/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-JCKANJ0TI7kzoQzuwB/OoJANy1Lg338B6+JVacPl4TpUwi3cReg3nMLplMq2uqYfHFQpKIlHAUVAJlImZz/4ng==",
+ "path": "system.reflection/4.1.0",
+ "hashPath": "system.reflection.4.1.0.nupkg.sha512"
+ },
+ "System.Reflection.Emit/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-P2wqAj72fFjpP6wb9nSfDqNBMab+2ovzSDzUZK7MVIm54tBJEPr9jWfSjjoTpPwj1LeKcmX3vr0ttyjSSFM47g==",
+ "path": "system.reflection.emit/4.0.1",
+ "hashPath": "system.reflection.emit.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.Emit.ILGeneration/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-Ov6dU8Bu15Bc7zuqttgHF12J5lwSWyTf1S+FJouUXVMSqImLZzYaQ+vRr1rQ0OZ0HqsrwWl4dsKHELckQkVpgA==",
+ "path": "system.reflection.emit.ilgeneration/4.0.1",
+ "hashPath": "system.reflection.emit.ilgeneration.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.Emit.Lightweight/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-sSzHHXueZ5Uh0OLpUQprhr+ZYJrLPA2Cmr4gn0wj9+FftNKXx8RIMKvO9qnjk2ebPYUjZ+F2ulGdPOsvj+MEjA==",
+ "path": "system.reflection.emit.lightweight/4.0.1",
+ "hashPath": "system.reflection.emit.lightweight.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.Extensions/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-GYrtRsZcMuHF3sbmRHfMYpvxZoIN2bQGrYGerUiWLEkqdEUQZhH3TRSaC/oI4wO0II1RKBPlpIa1TOMxIcOOzQ==",
+ "path": "system.reflection.extensions/4.0.1",
+ "hashPath": "system.reflection.extensions.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.Primitives/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-4inTox4wTBaDhB7V3mPvp9XlCbeGYWVEM9/fXALd52vNEAVisc1BoVWQPuUuD0Ga//dNbA/WeMy9u9mzLxGTHQ==",
+ "path": "system.reflection.primitives/4.0.1",
+ "hashPath": "system.reflection.primitives.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.TypeExtensions/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-tsQ/ptQ3H5FYfON8lL4MxRk/8kFyE0A+tGPXmVP967cT/gzLHYxIejIYSxp4JmIeFHVP78g/F2FE1mUUTbDtrg==",
+ "path": "system.reflection.typeextensions/4.1.0",
+ "hashPath": "system.reflection.typeextensions.4.1.0.nupkg.sha512"
+ },
+ "System.Resources.ResourceManager/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-TxwVeUNoTgUOdQ09gfTjvW411MF+w9MBYL7AtNVc+HtBCFlutPLhUCdZjNkjbhj3bNQWMdHboF0KIWEOjJssbA==",
+ "path": "system.resources.resourcemanager/4.0.1",
+ "hashPath": "system.resources.resourcemanager.4.0.1.nupkg.sha512"
+ },
+ "System.Runtime/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-v6c/4Yaa9uWsq+JMhnOFewrYkgdNHNG2eMKuNqRn8P733rNXeRCGvV5FkkjBXn2dbVkPXOsO0xjsEeM1q2zC0g==",
+ "path": "system.runtime/4.1.0",
+ "hashPath": "system.runtime.4.1.0.nupkg.sha512"
+ },
+ "System.Runtime.Extensions/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-CUOHjTT/vgP0qGW22U4/hDlOqXmcPq5YicBaXdUR2UiUoLwBT+olO6we4DVbq57jeX5uXH2uerVZhf0qGj+sVQ==",
+ "path": "system.runtime.extensions/4.1.0",
+ "hashPath": "system.runtime.extensions.4.1.0.nupkg.sha512"
+ },
+ "System.Runtime.Serialization.Primitives/4.1.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-HZ6Du5QrTG8MNJbf4e4qMO3JRAkIboGT5Fk804uZtg3Gq516S7hAqTm2UZKUHa7/6HUGdVy3AqMQKbns06G/cg==",
+ "path": "system.runtime.serialization.primitives/4.1.1",
+ "hashPath": "system.runtime.serialization.primitives.4.1.1.nupkg.sha512"
+ },
+ "System.Text.Encoding/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-U3gGeMlDZXxCEiY4DwVLSacg+DFWCvoiX+JThA/rvw37Sqrku7sEFeVBBBMBnfB6FeZHsyDx85HlKL19x0HtZA==",
+ "path": "system.text.encoding/4.0.11",
+ "hashPath": "system.text.encoding.4.0.11.nupkg.sha512"
+ },
+ "System.Text.Encoding.Extensions/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-jtbiTDtvfLYgXn8PTfWI+SiBs51rrmO4AAckx4KR6vFK9Wzf6tI8kcRdsYQNwriUeQ1+CtQbM1W4cMbLXnj/OQ==",
+ "path": "system.text.encoding.extensions/4.0.11",
+ "hashPath": "system.text.encoding.extensions.4.0.11.nupkg.sha512"
+ },
+ "System.Text.RegularExpressions/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-i88YCXpRTjCnoSQZtdlHkAOx4KNNik4hMy83n0+Ftlb7jvV6ZiZWMpnEZHhjBp6hQVh8gWd/iKNPzlPF7iyA2g==",
+ "path": "system.text.regularexpressions/4.1.0",
+ "hashPath": "system.text.regularexpressions.4.1.0.nupkg.sha512"
+ },
+ "System.Threading/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-N+3xqIcg3VDKyjwwCGaZ9HawG9aC6cSDI+s7ROma310GQo8vilFZa86hqKppwTHleR/G0sfOzhvgnUxWCR/DrQ==",
+ "path": "system.threading/4.0.11",
+ "hashPath": "system.threading.4.0.11.nupkg.sha512"
+ },
+ "System.Threading.Tasks/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-k1S4Gc6IGwtHGT8188RSeGaX86Qw/wnrgNLshJvsdNUOPP9etMmo8S07c+UlOAx4K/xLuN9ivA1bD0LVurtIxQ==",
+ "path": "system.threading.tasks/4.0.11",
+ "hashPath": "system.threading.tasks.4.0.11.nupkg.sha512"
+ },
+ "Ude.NetStandard/1.2.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-zRWpPAxBg3lNdm4UiKixTe+DFPoNid9CILggTCy/0WR2WKETe17kTWhiiIpLB2k5IEgnvA0QLfKlvd6Tvu0pzA==",
+ "path": "ude.netstandard/1.2.0",
+ "hashPath": "ude.netstandard.1.2.0.nupkg.sha512"
+ },
+ "YamlDotNet.NetCore/1.0.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-vPiKF4Yf02MS96Nzwcr8+WrvlhTx+camOgUzxhazU0hCzs2ESetWDCxaIT/MYdAw2oONYem1ow9PXWJjHkRUDw==",
+ "path": "yamldotnet.netcore/1.0.0",
+ "hashPath": "yamldotnet.netcore.1.0.0.nupkg.sha512"
+ },
+ "Luban.Core/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "Luban.DataLoader.Builtin/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ }
+ }
+}
\ No newline at end of file
diff --git a/Config/Tools/Luban/Luban.L10N.dll b/Config/Tools/Luban/Luban.L10N.dll
new file mode 100644
index 0000000..6e157c2
Binary files /dev/null and b/Config/Tools/Luban/Luban.L10N.dll differ
diff --git a/Config/Tools/Luban/Luban.Lua.deps.json b/Config/Tools/Luban/Luban.Lua.deps.json
new file mode 100644
index 0000000..dd9127d
--- /dev/null
+++ b/Config/Tools/Luban/Luban.Lua.deps.json
@@ -0,0 +1,73 @@
+{
+ "runtimeTarget": {
+ "name": ".NETCoreApp,Version=v8.0",
+ "signature": ""
+ },
+ "compilationOptions": {},
+ "targets": {
+ ".NETCoreApp,Version=v8.0": {
+ "Luban.Lua/1.0.0": {
+ "dependencies": {
+ "Luban.Core": "1.0.0"
+ },
+ "runtime": {
+ "Luban.Lua.dll": {}
+ }
+ },
+ "NLog/5.3.4": {
+ "runtime": {
+ "lib/netstandard2.0/NLog.dll": {
+ "assemblyVersion": "5.0.0.0",
+ "fileVersion": "5.3.4.2778"
+ }
+ }
+ },
+ "Scriban/5.12.0": {
+ "runtime": {
+ "lib/net7.0/Scriban.dll": {
+ "assemblyVersion": "5.0.0.0",
+ "fileVersion": "5.12.0.0"
+ }
+ }
+ },
+ "Luban.Core/1.0.0": {
+ "dependencies": {
+ "NLog": "5.3.4",
+ "Scriban": "5.12.0"
+ },
+ "runtime": {
+ "Luban.Core.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ }
+ }
+ },
+ "libraries": {
+ "Luban.Lua/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "NLog/5.3.4": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-gLy7+O1hEYJXIlcTr1/VWjGXrZTQFZzYNO18IWasD64pNwz0BreV+nHLxWKXWZzERRzoKnsk2XYtwLkTVk7J1A==",
+ "path": "nlog/5.3.4",
+ "hashPath": "nlog.5.3.4.nupkg.sha512"
+ },
+ "Scriban/5.12.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-/YTTCxjBIpfwX3MKMT4JMFVl1jX4IHW7zih+Bg3cTIkzGnbFt+B3l/k90ILDw6DRiFE7T+VxEyls7zk4p029ng==",
+ "path": "scriban/5.12.0",
+ "hashPath": "scriban.5.12.0.nupkg.sha512"
+ },
+ "Luban.Core/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ }
+ }
+}
\ No newline at end of file
diff --git a/Config/Tools/Luban/Luban.Lua.dll b/Config/Tools/Luban/Luban.Lua.dll
new file mode 100644
index 0000000..2e093af
Binary files /dev/null and b/Config/Tools/Luban/Luban.Lua.dll differ
diff --git a/Config/Tools/Luban/Luban.MsgPack.deps.json b/Config/Tools/Luban/Luban.MsgPack.deps.json
new file mode 100644
index 0000000..8d9d9fd
--- /dev/null
+++ b/Config/Tools/Luban/Luban.MsgPack.deps.json
@@ -0,0 +1,123 @@
+{
+ "runtimeTarget": {
+ "name": ".NETCoreApp,Version=v8.0",
+ "signature": ""
+ },
+ "compilationOptions": {},
+ "targets": {
+ ".NETCoreApp,Version=v8.0": {
+ "Luban.MsgPack/1.0.0": {
+ "dependencies": {
+ "Luban.Core": "1.0.0",
+ "MessagePack": "2.5.192"
+ },
+ "runtime": {
+ "Luban.MsgPack.dll": {}
+ }
+ },
+ "MessagePack/2.5.192": {
+ "dependencies": {
+ "MessagePack.Annotations": "2.5.192",
+ "Microsoft.NET.StringTools": "17.6.3"
+ },
+ "runtime": {
+ "lib/net6.0/MessagePack.dll": {
+ "assemblyVersion": "2.5.0.0",
+ "fileVersion": "2.5.192.54228"
+ }
+ }
+ },
+ "MessagePack.Annotations/2.5.192": {
+ "runtime": {
+ "lib/netstandard2.0/MessagePack.Annotations.dll": {
+ "assemblyVersion": "2.5.0.0",
+ "fileVersion": "2.5.192.54228"
+ }
+ }
+ },
+ "Microsoft.NET.StringTools/17.6.3": {
+ "runtime": {
+ "lib/net7.0/Microsoft.NET.StringTools.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "17.6.3.22601"
+ }
+ }
+ },
+ "NLog/5.3.4": {
+ "runtime": {
+ "lib/netstandard2.0/NLog.dll": {
+ "assemblyVersion": "5.0.0.0",
+ "fileVersion": "5.3.4.2778"
+ }
+ }
+ },
+ "Scriban/5.12.0": {
+ "runtime": {
+ "lib/net7.0/Scriban.dll": {
+ "assemblyVersion": "5.0.0.0",
+ "fileVersion": "5.12.0.0"
+ }
+ }
+ },
+ "Luban.Core/1.0.0": {
+ "dependencies": {
+ "NLog": "5.3.4",
+ "Scriban": "5.12.0"
+ },
+ "runtime": {
+ "Luban.Core.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ }
+ }
+ },
+ "libraries": {
+ "Luban.MsgPack/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "MessagePack/2.5.192": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-Jtle5MaFeIFkdXtxQeL9Tu2Y3HsAQGoSntOzrn6Br/jrl6c8QmG22GEioT5HBtZJR0zw0s46OnKU8ei2M3QifA==",
+ "path": "messagepack/2.5.192",
+ "hashPath": "messagepack.2.5.192.nupkg.sha512"
+ },
+ "MessagePack.Annotations/2.5.192": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-jaJuwcgovWIZ8Zysdyf3b7b34/BrADw4v82GaEZymUhDd3ScMPrYd/cttekeDteJJPXseJxp04yTIcxiVUjTWg==",
+ "path": "messagepack.annotations/2.5.192",
+ "hashPath": "messagepack.annotations.2.5.192.nupkg.sha512"
+ },
+ "Microsoft.NET.StringTools/17.6.3": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-N0ZIanl1QCgvUumEL1laasU0a7sOE5ZwLZVTn0pAePnfhq8P7SvTjF8Axq+CnavuQkmdQpGNXQ1efZtu5kDFbA==",
+ "path": "microsoft.net.stringtools/17.6.3",
+ "hashPath": "microsoft.net.stringtools.17.6.3.nupkg.sha512"
+ },
+ "NLog/5.3.4": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-gLy7+O1hEYJXIlcTr1/VWjGXrZTQFZzYNO18IWasD64pNwz0BreV+nHLxWKXWZzERRzoKnsk2XYtwLkTVk7J1A==",
+ "path": "nlog/5.3.4",
+ "hashPath": "nlog.5.3.4.nupkg.sha512"
+ },
+ "Scriban/5.12.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-/YTTCxjBIpfwX3MKMT4JMFVl1jX4IHW7zih+Bg3cTIkzGnbFt+B3l/k90ILDw6DRiFE7T+VxEyls7zk4p029ng==",
+ "path": "scriban/5.12.0",
+ "hashPath": "scriban.5.12.0.nupkg.sha512"
+ },
+ "Luban.Core/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ }
+ }
+}
\ No newline at end of file
diff --git a/Config/Tools/Luban/Luban.MsgPack.dll b/Config/Tools/Luban/Luban.MsgPack.dll
new file mode 100644
index 0000000..6d46a5f
Binary files /dev/null and b/Config/Tools/Luban/Luban.MsgPack.dll differ
diff --git a/Config/Tools/Luban/Luban.PHP.deps.json b/Config/Tools/Luban/Luban.PHP.deps.json
new file mode 100644
index 0000000..6447dd8
--- /dev/null
+++ b/Config/Tools/Luban/Luban.PHP.deps.json
@@ -0,0 +1,581 @@
+{
+ "runtimeTarget": {
+ "name": ".NETCoreApp,Version=v8.0",
+ "signature": ""
+ },
+ "compilationOptions": {},
+ "targets": {
+ ".NETCoreApp,Version=v8.0": {
+ "Luban.PHP/1.0.0": {
+ "dependencies": {
+ "Luban.Core": "1.0.0",
+ "Luban.DataTarget.Builtin": "1.0.0"
+ },
+ "runtime": {
+ "Luban.PHP.dll": {}
+ }
+ },
+ "ExcelDataReader/3.7.0": {
+ "runtime": {
+ "lib/netstandard2.1/ExcelDataReader.dll": {
+ "assemblyVersion": "3.7.0.0",
+ "fileVersion": "3.7.0.0"
+ }
+ }
+ },
+ "Microsoft.CSharp/4.5.0": {},
+ "Microsoft.NETCore.Platforms/1.0.1": {},
+ "Microsoft.NETCore.Targets/1.0.1": {},
+ "NeoLua/1.3.14": {
+ "dependencies": {
+ "Microsoft.CSharp": "4.5.0"
+ },
+ "runtime": {
+ "lib/net5.0/Neo.Lua.dll": {
+ "assemblyVersion": "5.3.0.0",
+ "fileVersion": "1.3.14.0"
+ }
+ },
+ "resources": {
+ "lib/net5.0/de/Neo.Lua.resources.dll": {
+ "locale": "de"
+ }
+ }
+ },
+ "NLog/5.3.4": {
+ "runtime": {
+ "lib/netstandard2.0/NLog.dll": {
+ "assemblyVersion": "5.0.0.0",
+ "fileVersion": "5.3.4.2778"
+ }
+ }
+ },
+ "Scriban/5.12.0": {
+ "runtime": {
+ "lib/net7.0/Scriban.dll": {
+ "assemblyVersion": "5.0.0.0",
+ "fileVersion": "5.12.0.0"
+ }
+ }
+ },
+ "System.Collections/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Diagnostics.Debug/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Diagnostics.Tools/4.0.1": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Globalization/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.IO/4.1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Text.Encoding": "4.0.11",
+ "System.Threading.Tasks": "4.0.11"
+ }
+ },
+ "System.Linq/4.1.0": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0"
+ }
+ },
+ "System.Linq.Expressions/4.1.0": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Globalization": "4.0.11",
+ "System.IO": "4.1.0",
+ "System.Linq": "4.1.0",
+ "System.ObjectModel": "4.0.12",
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Emit": "4.0.1",
+ "System.Reflection.Emit.ILGeneration": "4.0.1",
+ "System.Reflection.Emit.Lightweight": "4.0.1",
+ "System.Reflection.Extensions": "4.0.1",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Reflection.TypeExtensions": "4.1.0",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Threading": "4.0.11"
+ }
+ },
+ "System.ObjectModel/4.0.12": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Threading": "4.0.11"
+ }
+ },
+ "System.Reflection/4.1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.IO": "4.1.0",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Emit/4.0.1": {
+ "dependencies": {
+ "System.IO": "4.1.0",
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Emit.ILGeneration": "4.0.1",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Emit.ILGeneration/4.0.1": {
+ "dependencies": {
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Emit.Lightweight/4.0.1": {
+ "dependencies": {
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Emit.ILGeneration": "4.0.1",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Extensions/4.0.1": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Reflection": "4.1.0",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Primitives/4.0.1": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.TypeExtensions/4.1.0": {
+ "dependencies": {
+ "System.Reflection": "4.1.0",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Resources.ResourceManager/4.0.1": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Globalization": "4.0.11",
+ "System.Reflection": "4.1.0",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Runtime/4.1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1"
+ }
+ },
+ "System.Runtime.Extensions/4.1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Runtime.Serialization.Primitives/4.1.1": {
+ "dependencies": {
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Text.Encoding/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Text.Encoding.Extensions/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Text.Encoding": "4.0.11"
+ }
+ },
+ "System.Text.RegularExpressions/4.1.0": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Globalization": "4.0.11",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Threading": "4.0.11"
+ }
+ },
+ "System.Threading/4.0.11": {
+ "dependencies": {
+ "System.Runtime": "4.1.0",
+ "System.Threading.Tasks": "4.0.11"
+ }
+ },
+ "System.Threading.Tasks/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "Ude.NetStandard/1.2.0": {
+ "runtime": {
+ "lib/netstandard2.0/Ude.NetStandard.dll": {
+ "assemblyVersion": "1.0.2.0",
+ "fileVersion": "1.0.2.0"
+ }
+ }
+ },
+ "YamlDotNet.NetCore/1.0.0": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Diagnostics.Tools": "4.0.1",
+ "System.Globalization": "4.0.11",
+ "System.Linq": "4.1.0",
+ "System.Linq.Expressions": "4.1.0",
+ "System.ObjectModel": "4.0.12",
+ "System.Reflection.Extensions": "4.0.1",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Runtime.Serialization.Primitives": "4.1.1",
+ "System.Text.Encoding.Extensions": "4.0.11",
+ "System.Text.RegularExpressions": "4.1.0"
+ },
+ "runtime": {
+ "lib/netstandard1.0/YamlDotNet.NetCore.dll": {
+ "assemblyVersion": "0.0.1.0",
+ "fileVersion": "0.0.0.0"
+ }
+ }
+ },
+ "Luban.Core/1.0.0": {
+ "dependencies": {
+ "NLog": "5.3.4",
+ "Scriban": "5.12.0"
+ },
+ "runtime": {
+ "Luban.Core.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ },
+ "Luban.DataLoader.Builtin/1.0.0": {
+ "dependencies": {
+ "ExcelDataReader": "3.7.0",
+ "Luban.Core": "1.0.0",
+ "NeoLua": "1.3.14",
+ "Ude.NetStandard": "1.2.0",
+ "YamlDotNet.NetCore": "1.0.0"
+ },
+ "runtime": {
+ "Luban.DataLoader.Builtin.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ },
+ "Luban.DataTarget.Builtin/1.0.0": {
+ "dependencies": {
+ "Luban.Core": "1.0.0",
+ "Luban.DataLoader.Builtin": "1.0.0"
+ },
+ "runtime": {
+ "Luban.DataTarget.Builtin.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ }
+ }
+ },
+ "libraries": {
+ "Luban.PHP/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "ExcelDataReader/3.7.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-AMv3oDETRHSRyXC17rBtKH45qIfFyo433LMeaMB3u4RNr/c9Luuc0Z+JMP6+3Cx9n4wXqFqcrEIVxrf/GgYnZg==",
+ "path": "exceldatareader/3.7.0",
+ "hashPath": "exceldatareader.3.7.0.nupkg.sha512"
+ },
+ "Microsoft.CSharp/4.5.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-kaj6Wb4qoMuH3HySFJhxwQfe8R/sJsNJnANrvv8WdFPMoNbKY5htfNscv+LHCu5ipz+49m2e+WQXpLXr9XYemQ==",
+ "path": "microsoft.csharp/4.5.0",
+ "hashPath": "microsoft.csharp.4.5.0.nupkg.sha512"
+ },
+ "Microsoft.NETCore.Platforms/1.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-2G6OjjJzwBfNOO8myRV/nFrbTw5iA+DEm0N+qUqhrOmaVtn4pC77h38I1jsXGw5VH55+dPfQsqHD0We9sCl9FQ==",
+ "path": "microsoft.netcore.platforms/1.0.1",
+ "hashPath": "microsoft.netcore.platforms.1.0.1.nupkg.sha512"
+ },
+ "Microsoft.NETCore.Targets/1.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-rkn+fKobF/cbWfnnfBOQHKVKIOpxMZBvlSHkqDWgBpwGDcLRduvs3D9OLGeV6GWGvVwNlVi2CBbTjuPmtHvyNw==",
+ "path": "microsoft.netcore.targets/1.0.1",
+ "hashPath": "microsoft.netcore.targets.1.0.1.nupkg.sha512"
+ },
+ "NeoLua/1.3.14": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-BXIUN+ePY2wx3ZGiSmR8KZKD85s01pXI690orrB3u/biB8R0nalziGw+iGbPBq1Cuz8Upggpw2ERF84POXWTCQ==",
+ "path": "neolua/1.3.14",
+ "hashPath": "neolua.1.3.14.nupkg.sha512"
+ },
+ "NLog/5.3.4": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-gLy7+O1hEYJXIlcTr1/VWjGXrZTQFZzYNO18IWasD64pNwz0BreV+nHLxWKXWZzERRzoKnsk2XYtwLkTVk7J1A==",
+ "path": "nlog/5.3.4",
+ "hashPath": "nlog.5.3.4.nupkg.sha512"
+ },
+ "Scriban/5.12.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-/YTTCxjBIpfwX3MKMT4JMFVl1jX4IHW7zih+Bg3cTIkzGnbFt+B3l/k90ILDw6DRiFE7T+VxEyls7zk4p029ng==",
+ "path": "scriban/5.12.0",
+ "hashPath": "scriban.5.12.0.nupkg.sha512"
+ },
+ "System.Collections/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-YUJGz6eFKqS0V//mLt25vFGrrCvOnsXjlvFQs+KimpwNxug9x0Pzy4PlFMU3Q2IzqAa9G2L4LsK3+9vCBK7oTg==",
+ "path": "system.collections/4.0.11",
+ "hashPath": "system.collections.4.0.11.nupkg.sha512"
+ },
+ "System.Diagnostics.Debug/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-w5U95fVKHY4G8ASs/K5iK3J5LY+/dLFd4vKejsnI/ZhBsWS9hQakfx3Zr7lRWKg4tAw9r4iktyvsTagWkqYCiw==",
+ "path": "system.diagnostics.debug/4.0.11",
+ "hashPath": "system.diagnostics.debug.4.0.11.nupkg.sha512"
+ },
+ "System.Diagnostics.Tools/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-xBfJ8pnd4C17dWaC9FM6aShzbJcRNMChUMD42I6772KGGrqaFdumwhn9OdM68erj1ueNo3xdQ1EwiFjK5k8p0g==",
+ "path": "system.diagnostics.tools/4.0.1",
+ "hashPath": "system.diagnostics.tools.4.0.1.nupkg.sha512"
+ },
+ "System.Globalization/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-B95h0YLEL2oSnwF/XjqSWKnwKOy/01VWkNlsCeMTFJLLabflpGV26nK164eRs5GiaRSBGpOxQ3pKoSnnyZN5pg==",
+ "path": "system.globalization/4.0.11",
+ "hashPath": "system.globalization.4.0.11.nupkg.sha512"
+ },
+ "System.IO/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-3KlTJceQc3gnGIaHZ7UBZO26SHL1SHE4ddrmiwumFnId+CEHP+O8r386tZKaE6zlk5/mF8vifMBzHj9SaXN+mQ==",
+ "path": "system.io/4.1.0",
+ "hashPath": "system.io.4.1.0.nupkg.sha512"
+ },
+ "System.Linq/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-bQ0iYFOQI0nuTnt+NQADns6ucV4DUvMdwN6CbkB1yj8i7arTGiTN5eok1kQwdnnNWSDZfIUySQY+J3d5KjWn0g==",
+ "path": "system.linq/4.1.0",
+ "hashPath": "system.linq.4.1.0.nupkg.sha512"
+ },
+ "System.Linq.Expressions/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-I+y02iqkgmCAyfbqOmSDOgqdZQ5tTj80Akm5BPSS8EeB0VGWdy6X1KCoYe8Pk6pwDoAKZUOdLVxnTJcExiv5zw==",
+ "path": "system.linq.expressions/4.1.0",
+ "hashPath": "system.linq.expressions.4.1.0.nupkg.sha512"
+ },
+ "System.ObjectModel/4.0.12": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-tAgJM1xt3ytyMoW4qn4wIqgJYm7L7TShRZG4+Q4Qsi2PCcj96pXN7nRywS9KkB3p/xDUjc2HSwP9SROyPYDYKQ==",
+ "path": "system.objectmodel/4.0.12",
+ "hashPath": "system.objectmodel.4.0.12.nupkg.sha512"
+ },
+ "System.Reflection/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-JCKANJ0TI7kzoQzuwB/OoJANy1Lg338B6+JVacPl4TpUwi3cReg3nMLplMq2uqYfHFQpKIlHAUVAJlImZz/4ng==",
+ "path": "system.reflection/4.1.0",
+ "hashPath": "system.reflection.4.1.0.nupkg.sha512"
+ },
+ "System.Reflection.Emit/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-P2wqAj72fFjpP6wb9nSfDqNBMab+2ovzSDzUZK7MVIm54tBJEPr9jWfSjjoTpPwj1LeKcmX3vr0ttyjSSFM47g==",
+ "path": "system.reflection.emit/4.0.1",
+ "hashPath": "system.reflection.emit.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.Emit.ILGeneration/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-Ov6dU8Bu15Bc7zuqttgHF12J5lwSWyTf1S+FJouUXVMSqImLZzYaQ+vRr1rQ0OZ0HqsrwWl4dsKHELckQkVpgA==",
+ "path": "system.reflection.emit.ilgeneration/4.0.1",
+ "hashPath": "system.reflection.emit.ilgeneration.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.Emit.Lightweight/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-sSzHHXueZ5Uh0OLpUQprhr+ZYJrLPA2Cmr4gn0wj9+FftNKXx8RIMKvO9qnjk2ebPYUjZ+F2ulGdPOsvj+MEjA==",
+ "path": "system.reflection.emit.lightweight/4.0.1",
+ "hashPath": "system.reflection.emit.lightweight.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.Extensions/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-GYrtRsZcMuHF3sbmRHfMYpvxZoIN2bQGrYGerUiWLEkqdEUQZhH3TRSaC/oI4wO0II1RKBPlpIa1TOMxIcOOzQ==",
+ "path": "system.reflection.extensions/4.0.1",
+ "hashPath": "system.reflection.extensions.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.Primitives/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-4inTox4wTBaDhB7V3mPvp9XlCbeGYWVEM9/fXALd52vNEAVisc1BoVWQPuUuD0Ga//dNbA/WeMy9u9mzLxGTHQ==",
+ "path": "system.reflection.primitives/4.0.1",
+ "hashPath": "system.reflection.primitives.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.TypeExtensions/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-tsQ/ptQ3H5FYfON8lL4MxRk/8kFyE0A+tGPXmVP967cT/gzLHYxIejIYSxp4JmIeFHVP78g/F2FE1mUUTbDtrg==",
+ "path": "system.reflection.typeextensions/4.1.0",
+ "hashPath": "system.reflection.typeextensions.4.1.0.nupkg.sha512"
+ },
+ "System.Resources.ResourceManager/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-TxwVeUNoTgUOdQ09gfTjvW411MF+w9MBYL7AtNVc+HtBCFlutPLhUCdZjNkjbhj3bNQWMdHboF0KIWEOjJssbA==",
+ "path": "system.resources.resourcemanager/4.0.1",
+ "hashPath": "system.resources.resourcemanager.4.0.1.nupkg.sha512"
+ },
+ "System.Runtime/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-v6c/4Yaa9uWsq+JMhnOFewrYkgdNHNG2eMKuNqRn8P733rNXeRCGvV5FkkjBXn2dbVkPXOsO0xjsEeM1q2zC0g==",
+ "path": "system.runtime/4.1.0",
+ "hashPath": "system.runtime.4.1.0.nupkg.sha512"
+ },
+ "System.Runtime.Extensions/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-CUOHjTT/vgP0qGW22U4/hDlOqXmcPq5YicBaXdUR2UiUoLwBT+olO6we4DVbq57jeX5uXH2uerVZhf0qGj+sVQ==",
+ "path": "system.runtime.extensions/4.1.0",
+ "hashPath": "system.runtime.extensions.4.1.0.nupkg.sha512"
+ },
+ "System.Runtime.Serialization.Primitives/4.1.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-HZ6Du5QrTG8MNJbf4e4qMO3JRAkIboGT5Fk804uZtg3Gq516S7hAqTm2UZKUHa7/6HUGdVy3AqMQKbns06G/cg==",
+ "path": "system.runtime.serialization.primitives/4.1.1",
+ "hashPath": "system.runtime.serialization.primitives.4.1.1.nupkg.sha512"
+ },
+ "System.Text.Encoding/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-U3gGeMlDZXxCEiY4DwVLSacg+DFWCvoiX+JThA/rvw37Sqrku7sEFeVBBBMBnfB6FeZHsyDx85HlKL19x0HtZA==",
+ "path": "system.text.encoding/4.0.11",
+ "hashPath": "system.text.encoding.4.0.11.nupkg.sha512"
+ },
+ "System.Text.Encoding.Extensions/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-jtbiTDtvfLYgXn8PTfWI+SiBs51rrmO4AAckx4KR6vFK9Wzf6tI8kcRdsYQNwriUeQ1+CtQbM1W4cMbLXnj/OQ==",
+ "path": "system.text.encoding.extensions/4.0.11",
+ "hashPath": "system.text.encoding.extensions.4.0.11.nupkg.sha512"
+ },
+ "System.Text.RegularExpressions/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-i88YCXpRTjCnoSQZtdlHkAOx4KNNik4hMy83n0+Ftlb7jvV6ZiZWMpnEZHhjBp6hQVh8gWd/iKNPzlPF7iyA2g==",
+ "path": "system.text.regularexpressions/4.1.0",
+ "hashPath": "system.text.regularexpressions.4.1.0.nupkg.sha512"
+ },
+ "System.Threading/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-N+3xqIcg3VDKyjwwCGaZ9HawG9aC6cSDI+s7ROma310GQo8vilFZa86hqKppwTHleR/G0sfOzhvgnUxWCR/DrQ==",
+ "path": "system.threading/4.0.11",
+ "hashPath": "system.threading.4.0.11.nupkg.sha512"
+ },
+ "System.Threading.Tasks/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-k1S4Gc6IGwtHGT8188RSeGaX86Qw/wnrgNLshJvsdNUOPP9etMmo8S07c+UlOAx4K/xLuN9ivA1bD0LVurtIxQ==",
+ "path": "system.threading.tasks/4.0.11",
+ "hashPath": "system.threading.tasks.4.0.11.nupkg.sha512"
+ },
+ "Ude.NetStandard/1.2.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-zRWpPAxBg3lNdm4UiKixTe+DFPoNid9CILggTCy/0WR2WKETe17kTWhiiIpLB2k5IEgnvA0QLfKlvd6Tvu0pzA==",
+ "path": "ude.netstandard/1.2.0",
+ "hashPath": "ude.netstandard.1.2.0.nupkg.sha512"
+ },
+ "YamlDotNet.NetCore/1.0.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-vPiKF4Yf02MS96Nzwcr8+WrvlhTx+camOgUzxhazU0hCzs2ESetWDCxaIT/MYdAw2oONYem1ow9PXWJjHkRUDw==",
+ "path": "yamldotnet.netcore/1.0.0",
+ "hashPath": "yamldotnet.netcore.1.0.0.nupkg.sha512"
+ },
+ "Luban.Core/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "Luban.DataLoader.Builtin/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "Luban.DataTarget.Builtin/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ }
+ }
+}
\ No newline at end of file
diff --git a/Config/Tools/Luban/Luban.PHP.dll b/Config/Tools/Luban/Luban.PHP.dll
new file mode 100644
index 0000000..1e9e107
Binary files /dev/null and b/Config/Tools/Luban/Luban.PHP.dll differ
diff --git a/Config/Tools/Luban/Luban.Protobuf.deps.json b/Config/Tools/Luban/Luban.Protobuf.deps.json
new file mode 100644
index 0000000..a791bf7
--- /dev/null
+++ b/Config/Tools/Luban/Luban.Protobuf.deps.json
@@ -0,0 +1,597 @@
+{
+ "runtimeTarget": {
+ "name": ".NETCoreApp,Version=v8.0",
+ "signature": ""
+ },
+ "compilationOptions": {},
+ "targets": {
+ ".NETCoreApp,Version=v8.0": {
+ "Luban.Protobuf/1.0.0": {
+ "dependencies": {
+ "Google.Protobuf": "3.29.0",
+ "Luban.Core": "1.0.0",
+ "Luban.DataTarget.Builtin": "1.0.0"
+ },
+ "runtime": {
+ "Luban.Protobuf.dll": {}
+ }
+ },
+ "ExcelDataReader/3.7.0": {
+ "runtime": {
+ "lib/netstandard2.1/ExcelDataReader.dll": {
+ "assemblyVersion": "3.7.0.0",
+ "fileVersion": "3.7.0.0"
+ }
+ }
+ },
+ "Google.Protobuf/3.29.0": {
+ "runtime": {
+ "lib/net5.0/Google.Protobuf.dll": {
+ "assemblyVersion": "3.29.0.0",
+ "fileVersion": "3.29.0.0"
+ }
+ }
+ },
+ "Microsoft.CSharp/4.5.0": {},
+ "Microsoft.NETCore.Platforms/1.0.1": {},
+ "Microsoft.NETCore.Targets/1.0.1": {},
+ "NeoLua/1.3.14": {
+ "dependencies": {
+ "Microsoft.CSharp": "4.5.0"
+ },
+ "runtime": {
+ "lib/net5.0/Neo.Lua.dll": {
+ "assemblyVersion": "5.3.0.0",
+ "fileVersion": "1.3.14.0"
+ }
+ },
+ "resources": {
+ "lib/net5.0/de/Neo.Lua.resources.dll": {
+ "locale": "de"
+ }
+ }
+ },
+ "NLog/5.3.4": {
+ "runtime": {
+ "lib/netstandard2.0/NLog.dll": {
+ "assemblyVersion": "5.0.0.0",
+ "fileVersion": "5.3.4.2778"
+ }
+ }
+ },
+ "Scriban/5.12.0": {
+ "runtime": {
+ "lib/net7.0/Scriban.dll": {
+ "assemblyVersion": "5.0.0.0",
+ "fileVersion": "5.12.0.0"
+ }
+ }
+ },
+ "System.Collections/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Diagnostics.Debug/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Diagnostics.Tools/4.0.1": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Globalization/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.IO/4.1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Text.Encoding": "4.0.11",
+ "System.Threading.Tasks": "4.0.11"
+ }
+ },
+ "System.Linq/4.1.0": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0"
+ }
+ },
+ "System.Linq.Expressions/4.1.0": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Globalization": "4.0.11",
+ "System.IO": "4.1.0",
+ "System.Linq": "4.1.0",
+ "System.ObjectModel": "4.0.12",
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Emit": "4.0.1",
+ "System.Reflection.Emit.ILGeneration": "4.0.1",
+ "System.Reflection.Emit.Lightweight": "4.0.1",
+ "System.Reflection.Extensions": "4.0.1",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Reflection.TypeExtensions": "4.1.0",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Threading": "4.0.11"
+ }
+ },
+ "System.ObjectModel/4.0.12": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Threading": "4.0.11"
+ }
+ },
+ "System.Reflection/4.1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.IO": "4.1.0",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Emit/4.0.1": {
+ "dependencies": {
+ "System.IO": "4.1.0",
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Emit.ILGeneration": "4.0.1",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Emit.ILGeneration/4.0.1": {
+ "dependencies": {
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Emit.Lightweight/4.0.1": {
+ "dependencies": {
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Emit.ILGeneration": "4.0.1",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Extensions/4.0.1": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Reflection": "4.1.0",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Primitives/4.0.1": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.TypeExtensions/4.1.0": {
+ "dependencies": {
+ "System.Reflection": "4.1.0",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Resources.ResourceManager/4.0.1": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Globalization": "4.0.11",
+ "System.Reflection": "4.1.0",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Runtime/4.1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1"
+ }
+ },
+ "System.Runtime.Extensions/4.1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Runtime.Serialization.Primitives/4.1.1": {
+ "dependencies": {
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Text.Encoding/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Text.Encoding.Extensions/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Text.Encoding": "4.0.11"
+ }
+ },
+ "System.Text.RegularExpressions/4.1.0": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Globalization": "4.0.11",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Threading": "4.0.11"
+ }
+ },
+ "System.Threading/4.0.11": {
+ "dependencies": {
+ "System.Runtime": "4.1.0",
+ "System.Threading.Tasks": "4.0.11"
+ }
+ },
+ "System.Threading.Tasks/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "Ude.NetStandard/1.2.0": {
+ "runtime": {
+ "lib/netstandard2.0/Ude.NetStandard.dll": {
+ "assemblyVersion": "1.0.2.0",
+ "fileVersion": "1.0.2.0"
+ }
+ }
+ },
+ "YamlDotNet.NetCore/1.0.0": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Diagnostics.Tools": "4.0.1",
+ "System.Globalization": "4.0.11",
+ "System.Linq": "4.1.0",
+ "System.Linq.Expressions": "4.1.0",
+ "System.ObjectModel": "4.0.12",
+ "System.Reflection.Extensions": "4.0.1",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Runtime.Serialization.Primitives": "4.1.1",
+ "System.Text.Encoding.Extensions": "4.0.11",
+ "System.Text.RegularExpressions": "4.1.0"
+ },
+ "runtime": {
+ "lib/netstandard1.0/YamlDotNet.NetCore.dll": {
+ "assemblyVersion": "0.0.1.0",
+ "fileVersion": "0.0.0.0"
+ }
+ }
+ },
+ "Luban.Core/1.0.0": {
+ "dependencies": {
+ "NLog": "5.3.4",
+ "Scriban": "5.12.0"
+ },
+ "runtime": {
+ "Luban.Core.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ },
+ "Luban.DataLoader.Builtin/1.0.0": {
+ "dependencies": {
+ "ExcelDataReader": "3.7.0",
+ "Luban.Core": "1.0.0",
+ "NeoLua": "1.3.14",
+ "Ude.NetStandard": "1.2.0",
+ "YamlDotNet.NetCore": "1.0.0"
+ },
+ "runtime": {
+ "Luban.DataLoader.Builtin.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ },
+ "Luban.DataTarget.Builtin/1.0.0": {
+ "dependencies": {
+ "Luban.Core": "1.0.0",
+ "Luban.DataLoader.Builtin": "1.0.0"
+ },
+ "runtime": {
+ "Luban.DataTarget.Builtin.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ }
+ }
+ },
+ "libraries": {
+ "Luban.Protobuf/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "ExcelDataReader/3.7.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-AMv3oDETRHSRyXC17rBtKH45qIfFyo433LMeaMB3u4RNr/c9Luuc0Z+JMP6+3Cx9n4wXqFqcrEIVxrf/GgYnZg==",
+ "path": "exceldatareader/3.7.0",
+ "hashPath": "exceldatareader.3.7.0.nupkg.sha512"
+ },
+ "Google.Protobuf/3.29.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-l1012jd1Y2XsLQ+h9cXE7Bo3WruXql3Xc3KP/z+yZDJMSkfb2guslHCxwFsqd2ScHB0h2J7Yuy255RrBD/DGBw==",
+ "path": "google.protobuf/3.29.0",
+ "hashPath": "google.protobuf.3.29.0.nupkg.sha512"
+ },
+ "Microsoft.CSharp/4.5.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-kaj6Wb4qoMuH3HySFJhxwQfe8R/sJsNJnANrvv8WdFPMoNbKY5htfNscv+LHCu5ipz+49m2e+WQXpLXr9XYemQ==",
+ "path": "microsoft.csharp/4.5.0",
+ "hashPath": "microsoft.csharp.4.5.0.nupkg.sha512"
+ },
+ "Microsoft.NETCore.Platforms/1.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-2G6OjjJzwBfNOO8myRV/nFrbTw5iA+DEm0N+qUqhrOmaVtn4pC77h38I1jsXGw5VH55+dPfQsqHD0We9sCl9FQ==",
+ "path": "microsoft.netcore.platforms/1.0.1",
+ "hashPath": "microsoft.netcore.platforms.1.0.1.nupkg.sha512"
+ },
+ "Microsoft.NETCore.Targets/1.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-rkn+fKobF/cbWfnnfBOQHKVKIOpxMZBvlSHkqDWgBpwGDcLRduvs3D9OLGeV6GWGvVwNlVi2CBbTjuPmtHvyNw==",
+ "path": "microsoft.netcore.targets/1.0.1",
+ "hashPath": "microsoft.netcore.targets.1.0.1.nupkg.sha512"
+ },
+ "NeoLua/1.3.14": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-BXIUN+ePY2wx3ZGiSmR8KZKD85s01pXI690orrB3u/biB8R0nalziGw+iGbPBq1Cuz8Upggpw2ERF84POXWTCQ==",
+ "path": "neolua/1.3.14",
+ "hashPath": "neolua.1.3.14.nupkg.sha512"
+ },
+ "NLog/5.3.4": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-gLy7+O1hEYJXIlcTr1/VWjGXrZTQFZzYNO18IWasD64pNwz0BreV+nHLxWKXWZzERRzoKnsk2XYtwLkTVk7J1A==",
+ "path": "nlog/5.3.4",
+ "hashPath": "nlog.5.3.4.nupkg.sha512"
+ },
+ "Scriban/5.12.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-/YTTCxjBIpfwX3MKMT4JMFVl1jX4IHW7zih+Bg3cTIkzGnbFt+B3l/k90ILDw6DRiFE7T+VxEyls7zk4p029ng==",
+ "path": "scriban/5.12.0",
+ "hashPath": "scriban.5.12.0.nupkg.sha512"
+ },
+ "System.Collections/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-YUJGz6eFKqS0V//mLt25vFGrrCvOnsXjlvFQs+KimpwNxug9x0Pzy4PlFMU3Q2IzqAa9G2L4LsK3+9vCBK7oTg==",
+ "path": "system.collections/4.0.11",
+ "hashPath": "system.collections.4.0.11.nupkg.sha512"
+ },
+ "System.Diagnostics.Debug/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-w5U95fVKHY4G8ASs/K5iK3J5LY+/dLFd4vKejsnI/ZhBsWS9hQakfx3Zr7lRWKg4tAw9r4iktyvsTagWkqYCiw==",
+ "path": "system.diagnostics.debug/4.0.11",
+ "hashPath": "system.diagnostics.debug.4.0.11.nupkg.sha512"
+ },
+ "System.Diagnostics.Tools/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-xBfJ8pnd4C17dWaC9FM6aShzbJcRNMChUMD42I6772KGGrqaFdumwhn9OdM68erj1ueNo3xdQ1EwiFjK5k8p0g==",
+ "path": "system.diagnostics.tools/4.0.1",
+ "hashPath": "system.diagnostics.tools.4.0.1.nupkg.sha512"
+ },
+ "System.Globalization/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-B95h0YLEL2oSnwF/XjqSWKnwKOy/01VWkNlsCeMTFJLLabflpGV26nK164eRs5GiaRSBGpOxQ3pKoSnnyZN5pg==",
+ "path": "system.globalization/4.0.11",
+ "hashPath": "system.globalization.4.0.11.nupkg.sha512"
+ },
+ "System.IO/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-3KlTJceQc3gnGIaHZ7UBZO26SHL1SHE4ddrmiwumFnId+CEHP+O8r386tZKaE6zlk5/mF8vifMBzHj9SaXN+mQ==",
+ "path": "system.io/4.1.0",
+ "hashPath": "system.io.4.1.0.nupkg.sha512"
+ },
+ "System.Linq/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-bQ0iYFOQI0nuTnt+NQADns6ucV4DUvMdwN6CbkB1yj8i7arTGiTN5eok1kQwdnnNWSDZfIUySQY+J3d5KjWn0g==",
+ "path": "system.linq/4.1.0",
+ "hashPath": "system.linq.4.1.0.nupkg.sha512"
+ },
+ "System.Linq.Expressions/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-I+y02iqkgmCAyfbqOmSDOgqdZQ5tTj80Akm5BPSS8EeB0VGWdy6X1KCoYe8Pk6pwDoAKZUOdLVxnTJcExiv5zw==",
+ "path": "system.linq.expressions/4.1.0",
+ "hashPath": "system.linq.expressions.4.1.0.nupkg.sha512"
+ },
+ "System.ObjectModel/4.0.12": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-tAgJM1xt3ytyMoW4qn4wIqgJYm7L7TShRZG4+Q4Qsi2PCcj96pXN7nRywS9KkB3p/xDUjc2HSwP9SROyPYDYKQ==",
+ "path": "system.objectmodel/4.0.12",
+ "hashPath": "system.objectmodel.4.0.12.nupkg.sha512"
+ },
+ "System.Reflection/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-JCKANJ0TI7kzoQzuwB/OoJANy1Lg338B6+JVacPl4TpUwi3cReg3nMLplMq2uqYfHFQpKIlHAUVAJlImZz/4ng==",
+ "path": "system.reflection/4.1.0",
+ "hashPath": "system.reflection.4.1.0.nupkg.sha512"
+ },
+ "System.Reflection.Emit/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-P2wqAj72fFjpP6wb9nSfDqNBMab+2ovzSDzUZK7MVIm54tBJEPr9jWfSjjoTpPwj1LeKcmX3vr0ttyjSSFM47g==",
+ "path": "system.reflection.emit/4.0.1",
+ "hashPath": "system.reflection.emit.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.Emit.ILGeneration/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-Ov6dU8Bu15Bc7zuqttgHF12J5lwSWyTf1S+FJouUXVMSqImLZzYaQ+vRr1rQ0OZ0HqsrwWl4dsKHELckQkVpgA==",
+ "path": "system.reflection.emit.ilgeneration/4.0.1",
+ "hashPath": "system.reflection.emit.ilgeneration.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.Emit.Lightweight/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-sSzHHXueZ5Uh0OLpUQprhr+ZYJrLPA2Cmr4gn0wj9+FftNKXx8RIMKvO9qnjk2ebPYUjZ+F2ulGdPOsvj+MEjA==",
+ "path": "system.reflection.emit.lightweight/4.0.1",
+ "hashPath": "system.reflection.emit.lightweight.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.Extensions/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-GYrtRsZcMuHF3sbmRHfMYpvxZoIN2bQGrYGerUiWLEkqdEUQZhH3TRSaC/oI4wO0II1RKBPlpIa1TOMxIcOOzQ==",
+ "path": "system.reflection.extensions/4.0.1",
+ "hashPath": "system.reflection.extensions.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.Primitives/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-4inTox4wTBaDhB7V3mPvp9XlCbeGYWVEM9/fXALd52vNEAVisc1BoVWQPuUuD0Ga//dNbA/WeMy9u9mzLxGTHQ==",
+ "path": "system.reflection.primitives/4.0.1",
+ "hashPath": "system.reflection.primitives.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.TypeExtensions/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-tsQ/ptQ3H5FYfON8lL4MxRk/8kFyE0A+tGPXmVP967cT/gzLHYxIejIYSxp4JmIeFHVP78g/F2FE1mUUTbDtrg==",
+ "path": "system.reflection.typeextensions/4.1.0",
+ "hashPath": "system.reflection.typeextensions.4.1.0.nupkg.sha512"
+ },
+ "System.Resources.ResourceManager/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-TxwVeUNoTgUOdQ09gfTjvW411MF+w9MBYL7AtNVc+HtBCFlutPLhUCdZjNkjbhj3bNQWMdHboF0KIWEOjJssbA==",
+ "path": "system.resources.resourcemanager/4.0.1",
+ "hashPath": "system.resources.resourcemanager.4.0.1.nupkg.sha512"
+ },
+ "System.Runtime/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-v6c/4Yaa9uWsq+JMhnOFewrYkgdNHNG2eMKuNqRn8P733rNXeRCGvV5FkkjBXn2dbVkPXOsO0xjsEeM1q2zC0g==",
+ "path": "system.runtime/4.1.0",
+ "hashPath": "system.runtime.4.1.0.nupkg.sha512"
+ },
+ "System.Runtime.Extensions/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-CUOHjTT/vgP0qGW22U4/hDlOqXmcPq5YicBaXdUR2UiUoLwBT+olO6we4DVbq57jeX5uXH2uerVZhf0qGj+sVQ==",
+ "path": "system.runtime.extensions/4.1.0",
+ "hashPath": "system.runtime.extensions.4.1.0.nupkg.sha512"
+ },
+ "System.Runtime.Serialization.Primitives/4.1.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-HZ6Du5QrTG8MNJbf4e4qMO3JRAkIboGT5Fk804uZtg3Gq516S7hAqTm2UZKUHa7/6HUGdVy3AqMQKbns06G/cg==",
+ "path": "system.runtime.serialization.primitives/4.1.1",
+ "hashPath": "system.runtime.serialization.primitives.4.1.1.nupkg.sha512"
+ },
+ "System.Text.Encoding/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-U3gGeMlDZXxCEiY4DwVLSacg+DFWCvoiX+JThA/rvw37Sqrku7sEFeVBBBMBnfB6FeZHsyDx85HlKL19x0HtZA==",
+ "path": "system.text.encoding/4.0.11",
+ "hashPath": "system.text.encoding.4.0.11.nupkg.sha512"
+ },
+ "System.Text.Encoding.Extensions/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-jtbiTDtvfLYgXn8PTfWI+SiBs51rrmO4AAckx4KR6vFK9Wzf6tI8kcRdsYQNwriUeQ1+CtQbM1W4cMbLXnj/OQ==",
+ "path": "system.text.encoding.extensions/4.0.11",
+ "hashPath": "system.text.encoding.extensions.4.0.11.nupkg.sha512"
+ },
+ "System.Text.RegularExpressions/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-i88YCXpRTjCnoSQZtdlHkAOx4KNNik4hMy83n0+Ftlb7jvV6ZiZWMpnEZHhjBp6hQVh8gWd/iKNPzlPF7iyA2g==",
+ "path": "system.text.regularexpressions/4.1.0",
+ "hashPath": "system.text.regularexpressions.4.1.0.nupkg.sha512"
+ },
+ "System.Threading/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-N+3xqIcg3VDKyjwwCGaZ9HawG9aC6cSDI+s7ROma310GQo8vilFZa86hqKppwTHleR/G0sfOzhvgnUxWCR/DrQ==",
+ "path": "system.threading/4.0.11",
+ "hashPath": "system.threading.4.0.11.nupkg.sha512"
+ },
+ "System.Threading.Tasks/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-k1S4Gc6IGwtHGT8188RSeGaX86Qw/wnrgNLshJvsdNUOPP9etMmo8S07c+UlOAx4K/xLuN9ivA1bD0LVurtIxQ==",
+ "path": "system.threading.tasks/4.0.11",
+ "hashPath": "system.threading.tasks.4.0.11.nupkg.sha512"
+ },
+ "Ude.NetStandard/1.2.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-zRWpPAxBg3lNdm4UiKixTe+DFPoNid9CILggTCy/0WR2WKETe17kTWhiiIpLB2k5IEgnvA0QLfKlvd6Tvu0pzA==",
+ "path": "ude.netstandard/1.2.0",
+ "hashPath": "ude.netstandard.1.2.0.nupkg.sha512"
+ },
+ "YamlDotNet.NetCore/1.0.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-vPiKF4Yf02MS96Nzwcr8+WrvlhTx+camOgUzxhazU0hCzs2ESetWDCxaIT/MYdAw2oONYem1ow9PXWJjHkRUDw==",
+ "path": "yamldotnet.netcore/1.0.0",
+ "hashPath": "yamldotnet.netcore.1.0.0.nupkg.sha512"
+ },
+ "Luban.Core/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "Luban.DataLoader.Builtin/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "Luban.DataTarget.Builtin/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ }
+ }
+}
\ No newline at end of file
diff --git a/Config/Tools/Luban/Luban.Protobuf.dll b/Config/Tools/Luban/Luban.Protobuf.dll
new file mode 100644
index 0000000..228eec6
Binary files /dev/null and b/Config/Tools/Luban/Luban.Protobuf.dll differ
diff --git a/Config/Tools/Luban/Luban.Python.deps.json b/Config/Tools/Luban/Luban.Python.deps.json
new file mode 100644
index 0000000..9afffa9
--- /dev/null
+++ b/Config/Tools/Luban/Luban.Python.deps.json
@@ -0,0 +1,581 @@
+{
+ "runtimeTarget": {
+ "name": ".NETCoreApp,Version=v8.0",
+ "signature": ""
+ },
+ "compilationOptions": {},
+ "targets": {
+ ".NETCoreApp,Version=v8.0": {
+ "Luban.Python/1.0.0": {
+ "dependencies": {
+ "Luban.Core": "1.0.0",
+ "Luban.DataTarget.Builtin": "1.0.0"
+ },
+ "runtime": {
+ "Luban.Python.dll": {}
+ }
+ },
+ "ExcelDataReader/3.7.0": {
+ "runtime": {
+ "lib/netstandard2.1/ExcelDataReader.dll": {
+ "assemblyVersion": "3.7.0.0",
+ "fileVersion": "3.7.0.0"
+ }
+ }
+ },
+ "Microsoft.CSharp/4.5.0": {},
+ "Microsoft.NETCore.Platforms/1.0.1": {},
+ "Microsoft.NETCore.Targets/1.0.1": {},
+ "NeoLua/1.3.14": {
+ "dependencies": {
+ "Microsoft.CSharp": "4.5.0"
+ },
+ "runtime": {
+ "lib/net5.0/Neo.Lua.dll": {
+ "assemblyVersion": "5.3.0.0",
+ "fileVersion": "1.3.14.0"
+ }
+ },
+ "resources": {
+ "lib/net5.0/de/Neo.Lua.resources.dll": {
+ "locale": "de"
+ }
+ }
+ },
+ "NLog/5.3.4": {
+ "runtime": {
+ "lib/netstandard2.0/NLog.dll": {
+ "assemblyVersion": "5.0.0.0",
+ "fileVersion": "5.3.4.2778"
+ }
+ }
+ },
+ "Scriban/5.12.0": {
+ "runtime": {
+ "lib/net7.0/Scriban.dll": {
+ "assemblyVersion": "5.0.0.0",
+ "fileVersion": "5.12.0.0"
+ }
+ }
+ },
+ "System.Collections/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Diagnostics.Debug/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Diagnostics.Tools/4.0.1": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Globalization/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.IO/4.1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Text.Encoding": "4.0.11",
+ "System.Threading.Tasks": "4.0.11"
+ }
+ },
+ "System.Linq/4.1.0": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0"
+ }
+ },
+ "System.Linq.Expressions/4.1.0": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Globalization": "4.0.11",
+ "System.IO": "4.1.0",
+ "System.Linq": "4.1.0",
+ "System.ObjectModel": "4.0.12",
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Emit": "4.0.1",
+ "System.Reflection.Emit.ILGeneration": "4.0.1",
+ "System.Reflection.Emit.Lightweight": "4.0.1",
+ "System.Reflection.Extensions": "4.0.1",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Reflection.TypeExtensions": "4.1.0",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Threading": "4.0.11"
+ }
+ },
+ "System.ObjectModel/4.0.12": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Threading": "4.0.11"
+ }
+ },
+ "System.Reflection/4.1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.IO": "4.1.0",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Emit/4.0.1": {
+ "dependencies": {
+ "System.IO": "4.1.0",
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Emit.ILGeneration": "4.0.1",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Emit.ILGeneration/4.0.1": {
+ "dependencies": {
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Emit.Lightweight/4.0.1": {
+ "dependencies": {
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Emit.ILGeneration": "4.0.1",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Extensions/4.0.1": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Reflection": "4.1.0",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Primitives/4.0.1": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.TypeExtensions/4.1.0": {
+ "dependencies": {
+ "System.Reflection": "4.1.0",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Resources.ResourceManager/4.0.1": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Globalization": "4.0.11",
+ "System.Reflection": "4.1.0",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Runtime/4.1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1"
+ }
+ },
+ "System.Runtime.Extensions/4.1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Runtime.Serialization.Primitives/4.1.1": {
+ "dependencies": {
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Text.Encoding/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Text.Encoding.Extensions/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Text.Encoding": "4.0.11"
+ }
+ },
+ "System.Text.RegularExpressions/4.1.0": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Globalization": "4.0.11",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Threading": "4.0.11"
+ }
+ },
+ "System.Threading/4.0.11": {
+ "dependencies": {
+ "System.Runtime": "4.1.0",
+ "System.Threading.Tasks": "4.0.11"
+ }
+ },
+ "System.Threading.Tasks/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "Ude.NetStandard/1.2.0": {
+ "runtime": {
+ "lib/netstandard2.0/Ude.NetStandard.dll": {
+ "assemblyVersion": "1.0.2.0",
+ "fileVersion": "1.0.2.0"
+ }
+ }
+ },
+ "YamlDotNet.NetCore/1.0.0": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Diagnostics.Tools": "4.0.1",
+ "System.Globalization": "4.0.11",
+ "System.Linq": "4.1.0",
+ "System.Linq.Expressions": "4.1.0",
+ "System.ObjectModel": "4.0.12",
+ "System.Reflection.Extensions": "4.0.1",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Runtime.Serialization.Primitives": "4.1.1",
+ "System.Text.Encoding.Extensions": "4.0.11",
+ "System.Text.RegularExpressions": "4.1.0"
+ },
+ "runtime": {
+ "lib/netstandard1.0/YamlDotNet.NetCore.dll": {
+ "assemblyVersion": "0.0.1.0",
+ "fileVersion": "0.0.0.0"
+ }
+ }
+ },
+ "Luban.Core/1.0.0": {
+ "dependencies": {
+ "NLog": "5.3.4",
+ "Scriban": "5.12.0"
+ },
+ "runtime": {
+ "Luban.Core.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ },
+ "Luban.DataLoader.Builtin/1.0.0": {
+ "dependencies": {
+ "ExcelDataReader": "3.7.0",
+ "Luban.Core": "1.0.0",
+ "NeoLua": "1.3.14",
+ "Ude.NetStandard": "1.2.0",
+ "YamlDotNet.NetCore": "1.0.0"
+ },
+ "runtime": {
+ "Luban.DataLoader.Builtin.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ },
+ "Luban.DataTarget.Builtin/1.0.0": {
+ "dependencies": {
+ "Luban.Core": "1.0.0",
+ "Luban.DataLoader.Builtin": "1.0.0"
+ },
+ "runtime": {
+ "Luban.DataTarget.Builtin.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ }
+ }
+ },
+ "libraries": {
+ "Luban.Python/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "ExcelDataReader/3.7.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-AMv3oDETRHSRyXC17rBtKH45qIfFyo433LMeaMB3u4RNr/c9Luuc0Z+JMP6+3Cx9n4wXqFqcrEIVxrf/GgYnZg==",
+ "path": "exceldatareader/3.7.0",
+ "hashPath": "exceldatareader.3.7.0.nupkg.sha512"
+ },
+ "Microsoft.CSharp/4.5.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-kaj6Wb4qoMuH3HySFJhxwQfe8R/sJsNJnANrvv8WdFPMoNbKY5htfNscv+LHCu5ipz+49m2e+WQXpLXr9XYemQ==",
+ "path": "microsoft.csharp/4.5.0",
+ "hashPath": "microsoft.csharp.4.5.0.nupkg.sha512"
+ },
+ "Microsoft.NETCore.Platforms/1.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-2G6OjjJzwBfNOO8myRV/nFrbTw5iA+DEm0N+qUqhrOmaVtn4pC77h38I1jsXGw5VH55+dPfQsqHD0We9sCl9FQ==",
+ "path": "microsoft.netcore.platforms/1.0.1",
+ "hashPath": "microsoft.netcore.platforms.1.0.1.nupkg.sha512"
+ },
+ "Microsoft.NETCore.Targets/1.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-rkn+fKobF/cbWfnnfBOQHKVKIOpxMZBvlSHkqDWgBpwGDcLRduvs3D9OLGeV6GWGvVwNlVi2CBbTjuPmtHvyNw==",
+ "path": "microsoft.netcore.targets/1.0.1",
+ "hashPath": "microsoft.netcore.targets.1.0.1.nupkg.sha512"
+ },
+ "NeoLua/1.3.14": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-BXIUN+ePY2wx3ZGiSmR8KZKD85s01pXI690orrB3u/biB8R0nalziGw+iGbPBq1Cuz8Upggpw2ERF84POXWTCQ==",
+ "path": "neolua/1.3.14",
+ "hashPath": "neolua.1.3.14.nupkg.sha512"
+ },
+ "NLog/5.3.4": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-gLy7+O1hEYJXIlcTr1/VWjGXrZTQFZzYNO18IWasD64pNwz0BreV+nHLxWKXWZzERRzoKnsk2XYtwLkTVk7J1A==",
+ "path": "nlog/5.3.4",
+ "hashPath": "nlog.5.3.4.nupkg.sha512"
+ },
+ "Scriban/5.12.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-/YTTCxjBIpfwX3MKMT4JMFVl1jX4IHW7zih+Bg3cTIkzGnbFt+B3l/k90ILDw6DRiFE7T+VxEyls7zk4p029ng==",
+ "path": "scriban/5.12.0",
+ "hashPath": "scriban.5.12.0.nupkg.sha512"
+ },
+ "System.Collections/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-YUJGz6eFKqS0V//mLt25vFGrrCvOnsXjlvFQs+KimpwNxug9x0Pzy4PlFMU3Q2IzqAa9G2L4LsK3+9vCBK7oTg==",
+ "path": "system.collections/4.0.11",
+ "hashPath": "system.collections.4.0.11.nupkg.sha512"
+ },
+ "System.Diagnostics.Debug/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-w5U95fVKHY4G8ASs/K5iK3J5LY+/dLFd4vKejsnI/ZhBsWS9hQakfx3Zr7lRWKg4tAw9r4iktyvsTagWkqYCiw==",
+ "path": "system.diagnostics.debug/4.0.11",
+ "hashPath": "system.diagnostics.debug.4.0.11.nupkg.sha512"
+ },
+ "System.Diagnostics.Tools/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-xBfJ8pnd4C17dWaC9FM6aShzbJcRNMChUMD42I6772KGGrqaFdumwhn9OdM68erj1ueNo3xdQ1EwiFjK5k8p0g==",
+ "path": "system.diagnostics.tools/4.0.1",
+ "hashPath": "system.diagnostics.tools.4.0.1.nupkg.sha512"
+ },
+ "System.Globalization/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-B95h0YLEL2oSnwF/XjqSWKnwKOy/01VWkNlsCeMTFJLLabflpGV26nK164eRs5GiaRSBGpOxQ3pKoSnnyZN5pg==",
+ "path": "system.globalization/4.0.11",
+ "hashPath": "system.globalization.4.0.11.nupkg.sha512"
+ },
+ "System.IO/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-3KlTJceQc3gnGIaHZ7UBZO26SHL1SHE4ddrmiwumFnId+CEHP+O8r386tZKaE6zlk5/mF8vifMBzHj9SaXN+mQ==",
+ "path": "system.io/4.1.0",
+ "hashPath": "system.io.4.1.0.nupkg.sha512"
+ },
+ "System.Linq/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-bQ0iYFOQI0nuTnt+NQADns6ucV4DUvMdwN6CbkB1yj8i7arTGiTN5eok1kQwdnnNWSDZfIUySQY+J3d5KjWn0g==",
+ "path": "system.linq/4.1.0",
+ "hashPath": "system.linq.4.1.0.nupkg.sha512"
+ },
+ "System.Linq.Expressions/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-I+y02iqkgmCAyfbqOmSDOgqdZQ5tTj80Akm5BPSS8EeB0VGWdy6X1KCoYe8Pk6pwDoAKZUOdLVxnTJcExiv5zw==",
+ "path": "system.linq.expressions/4.1.0",
+ "hashPath": "system.linq.expressions.4.1.0.nupkg.sha512"
+ },
+ "System.ObjectModel/4.0.12": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-tAgJM1xt3ytyMoW4qn4wIqgJYm7L7TShRZG4+Q4Qsi2PCcj96pXN7nRywS9KkB3p/xDUjc2HSwP9SROyPYDYKQ==",
+ "path": "system.objectmodel/4.0.12",
+ "hashPath": "system.objectmodel.4.0.12.nupkg.sha512"
+ },
+ "System.Reflection/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-JCKANJ0TI7kzoQzuwB/OoJANy1Lg338B6+JVacPl4TpUwi3cReg3nMLplMq2uqYfHFQpKIlHAUVAJlImZz/4ng==",
+ "path": "system.reflection/4.1.0",
+ "hashPath": "system.reflection.4.1.0.nupkg.sha512"
+ },
+ "System.Reflection.Emit/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-P2wqAj72fFjpP6wb9nSfDqNBMab+2ovzSDzUZK7MVIm54tBJEPr9jWfSjjoTpPwj1LeKcmX3vr0ttyjSSFM47g==",
+ "path": "system.reflection.emit/4.0.1",
+ "hashPath": "system.reflection.emit.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.Emit.ILGeneration/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-Ov6dU8Bu15Bc7zuqttgHF12J5lwSWyTf1S+FJouUXVMSqImLZzYaQ+vRr1rQ0OZ0HqsrwWl4dsKHELckQkVpgA==",
+ "path": "system.reflection.emit.ilgeneration/4.0.1",
+ "hashPath": "system.reflection.emit.ilgeneration.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.Emit.Lightweight/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-sSzHHXueZ5Uh0OLpUQprhr+ZYJrLPA2Cmr4gn0wj9+FftNKXx8RIMKvO9qnjk2ebPYUjZ+F2ulGdPOsvj+MEjA==",
+ "path": "system.reflection.emit.lightweight/4.0.1",
+ "hashPath": "system.reflection.emit.lightweight.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.Extensions/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-GYrtRsZcMuHF3sbmRHfMYpvxZoIN2bQGrYGerUiWLEkqdEUQZhH3TRSaC/oI4wO0II1RKBPlpIa1TOMxIcOOzQ==",
+ "path": "system.reflection.extensions/4.0.1",
+ "hashPath": "system.reflection.extensions.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.Primitives/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-4inTox4wTBaDhB7V3mPvp9XlCbeGYWVEM9/fXALd52vNEAVisc1BoVWQPuUuD0Ga//dNbA/WeMy9u9mzLxGTHQ==",
+ "path": "system.reflection.primitives/4.0.1",
+ "hashPath": "system.reflection.primitives.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.TypeExtensions/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-tsQ/ptQ3H5FYfON8lL4MxRk/8kFyE0A+tGPXmVP967cT/gzLHYxIejIYSxp4JmIeFHVP78g/F2FE1mUUTbDtrg==",
+ "path": "system.reflection.typeextensions/4.1.0",
+ "hashPath": "system.reflection.typeextensions.4.1.0.nupkg.sha512"
+ },
+ "System.Resources.ResourceManager/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-TxwVeUNoTgUOdQ09gfTjvW411MF+w9MBYL7AtNVc+HtBCFlutPLhUCdZjNkjbhj3bNQWMdHboF0KIWEOjJssbA==",
+ "path": "system.resources.resourcemanager/4.0.1",
+ "hashPath": "system.resources.resourcemanager.4.0.1.nupkg.sha512"
+ },
+ "System.Runtime/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-v6c/4Yaa9uWsq+JMhnOFewrYkgdNHNG2eMKuNqRn8P733rNXeRCGvV5FkkjBXn2dbVkPXOsO0xjsEeM1q2zC0g==",
+ "path": "system.runtime/4.1.0",
+ "hashPath": "system.runtime.4.1.0.nupkg.sha512"
+ },
+ "System.Runtime.Extensions/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-CUOHjTT/vgP0qGW22U4/hDlOqXmcPq5YicBaXdUR2UiUoLwBT+olO6we4DVbq57jeX5uXH2uerVZhf0qGj+sVQ==",
+ "path": "system.runtime.extensions/4.1.0",
+ "hashPath": "system.runtime.extensions.4.1.0.nupkg.sha512"
+ },
+ "System.Runtime.Serialization.Primitives/4.1.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-HZ6Du5QrTG8MNJbf4e4qMO3JRAkIboGT5Fk804uZtg3Gq516S7hAqTm2UZKUHa7/6HUGdVy3AqMQKbns06G/cg==",
+ "path": "system.runtime.serialization.primitives/4.1.1",
+ "hashPath": "system.runtime.serialization.primitives.4.1.1.nupkg.sha512"
+ },
+ "System.Text.Encoding/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-U3gGeMlDZXxCEiY4DwVLSacg+DFWCvoiX+JThA/rvw37Sqrku7sEFeVBBBMBnfB6FeZHsyDx85HlKL19x0HtZA==",
+ "path": "system.text.encoding/4.0.11",
+ "hashPath": "system.text.encoding.4.0.11.nupkg.sha512"
+ },
+ "System.Text.Encoding.Extensions/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-jtbiTDtvfLYgXn8PTfWI+SiBs51rrmO4AAckx4KR6vFK9Wzf6tI8kcRdsYQNwriUeQ1+CtQbM1W4cMbLXnj/OQ==",
+ "path": "system.text.encoding.extensions/4.0.11",
+ "hashPath": "system.text.encoding.extensions.4.0.11.nupkg.sha512"
+ },
+ "System.Text.RegularExpressions/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-i88YCXpRTjCnoSQZtdlHkAOx4KNNik4hMy83n0+Ftlb7jvV6ZiZWMpnEZHhjBp6hQVh8gWd/iKNPzlPF7iyA2g==",
+ "path": "system.text.regularexpressions/4.1.0",
+ "hashPath": "system.text.regularexpressions.4.1.0.nupkg.sha512"
+ },
+ "System.Threading/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-N+3xqIcg3VDKyjwwCGaZ9HawG9aC6cSDI+s7ROma310GQo8vilFZa86hqKppwTHleR/G0sfOzhvgnUxWCR/DrQ==",
+ "path": "system.threading/4.0.11",
+ "hashPath": "system.threading.4.0.11.nupkg.sha512"
+ },
+ "System.Threading.Tasks/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-k1S4Gc6IGwtHGT8188RSeGaX86Qw/wnrgNLshJvsdNUOPP9etMmo8S07c+UlOAx4K/xLuN9ivA1bD0LVurtIxQ==",
+ "path": "system.threading.tasks/4.0.11",
+ "hashPath": "system.threading.tasks.4.0.11.nupkg.sha512"
+ },
+ "Ude.NetStandard/1.2.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-zRWpPAxBg3lNdm4UiKixTe+DFPoNid9CILggTCy/0WR2WKETe17kTWhiiIpLB2k5IEgnvA0QLfKlvd6Tvu0pzA==",
+ "path": "ude.netstandard/1.2.0",
+ "hashPath": "ude.netstandard.1.2.0.nupkg.sha512"
+ },
+ "YamlDotNet.NetCore/1.0.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-vPiKF4Yf02MS96Nzwcr8+WrvlhTx+camOgUzxhazU0hCzs2ESetWDCxaIT/MYdAw2oONYem1ow9PXWJjHkRUDw==",
+ "path": "yamldotnet.netcore/1.0.0",
+ "hashPath": "yamldotnet.netcore.1.0.0.nupkg.sha512"
+ },
+ "Luban.Core/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "Luban.DataLoader.Builtin/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "Luban.DataTarget.Builtin/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ }
+ }
+}
\ No newline at end of file
diff --git a/Config/Tools/Luban/Luban.Python.dll b/Config/Tools/Luban/Luban.Python.dll
new file mode 100644
index 0000000..7d4f00d
Binary files /dev/null and b/Config/Tools/Luban/Luban.Python.dll differ
diff --git a/Config/Tools/Luban/Luban.Rust.deps.json b/Config/Tools/Luban/Luban.Rust.deps.json
new file mode 100644
index 0000000..63c7d1a
--- /dev/null
+++ b/Config/Tools/Luban/Luban.Rust.deps.json
@@ -0,0 +1,73 @@
+{
+ "runtimeTarget": {
+ "name": ".NETCoreApp,Version=v8.0",
+ "signature": ""
+ },
+ "compilationOptions": {},
+ "targets": {
+ ".NETCoreApp,Version=v8.0": {
+ "Luban.Rust/1.0.0": {
+ "dependencies": {
+ "Luban.Core": "1.0.0"
+ },
+ "runtime": {
+ "Luban.Rust.dll": {}
+ }
+ },
+ "NLog/5.3.4": {
+ "runtime": {
+ "lib/netstandard2.0/NLog.dll": {
+ "assemblyVersion": "5.0.0.0",
+ "fileVersion": "5.3.4.2778"
+ }
+ }
+ },
+ "Scriban/5.12.0": {
+ "runtime": {
+ "lib/net7.0/Scriban.dll": {
+ "assemblyVersion": "5.0.0.0",
+ "fileVersion": "5.12.0.0"
+ }
+ }
+ },
+ "Luban.Core/1.0.0": {
+ "dependencies": {
+ "NLog": "5.3.4",
+ "Scriban": "5.12.0"
+ },
+ "runtime": {
+ "Luban.Core.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ }
+ }
+ },
+ "libraries": {
+ "Luban.Rust/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "NLog/5.3.4": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-gLy7+O1hEYJXIlcTr1/VWjGXrZTQFZzYNO18IWasD64pNwz0BreV+nHLxWKXWZzERRzoKnsk2XYtwLkTVk7J1A==",
+ "path": "nlog/5.3.4",
+ "hashPath": "nlog.5.3.4.nupkg.sha512"
+ },
+ "Scriban/5.12.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-/YTTCxjBIpfwX3MKMT4JMFVl1jX4IHW7zih+Bg3cTIkzGnbFt+B3l/k90ILDw6DRiFE7T+VxEyls7zk4p029ng==",
+ "path": "scriban/5.12.0",
+ "hashPath": "scriban.5.12.0.nupkg.sha512"
+ },
+ "Luban.Core/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ }
+ }
+}
\ No newline at end of file
diff --git a/Config/Tools/Luban/Luban.Rust.dll b/Config/Tools/Luban/Luban.Rust.dll
new file mode 100644
index 0000000..2e8faee
Binary files /dev/null and b/Config/Tools/Luban/Luban.Rust.dll differ
diff --git a/Config/Tools/Luban/Luban.Schema.Builtin.deps.json b/Config/Tools/Luban/Luban.Schema.Builtin.deps.json
new file mode 100644
index 0000000..0f78b60
--- /dev/null
+++ b/Config/Tools/Luban/Luban.Schema.Builtin.deps.json
@@ -0,0 +1,564 @@
+{
+ "runtimeTarget": {
+ "name": ".NETCoreApp,Version=v8.0",
+ "signature": ""
+ },
+ "compilationOptions": {},
+ "targets": {
+ ".NETCoreApp,Version=v8.0": {
+ "Luban.Schema.Builtin/1.0.0": {
+ "dependencies": {
+ "Luban.Core": "1.0.0",
+ "Luban.DataLoader.Builtin": "1.0.0"
+ },
+ "runtime": {
+ "Luban.Schema.Builtin.dll": {}
+ }
+ },
+ "ExcelDataReader/3.7.0": {
+ "runtime": {
+ "lib/netstandard2.1/ExcelDataReader.dll": {
+ "assemblyVersion": "3.7.0.0",
+ "fileVersion": "3.7.0.0"
+ }
+ }
+ },
+ "Microsoft.CSharp/4.5.0": {},
+ "Microsoft.NETCore.Platforms/1.0.1": {},
+ "Microsoft.NETCore.Targets/1.0.1": {},
+ "NeoLua/1.3.14": {
+ "dependencies": {
+ "Microsoft.CSharp": "4.5.0"
+ },
+ "runtime": {
+ "lib/net5.0/Neo.Lua.dll": {
+ "assemblyVersion": "5.3.0.0",
+ "fileVersion": "1.3.14.0"
+ }
+ },
+ "resources": {
+ "lib/net5.0/de/Neo.Lua.resources.dll": {
+ "locale": "de"
+ }
+ }
+ },
+ "NLog/5.3.4": {
+ "runtime": {
+ "lib/netstandard2.0/NLog.dll": {
+ "assemblyVersion": "5.0.0.0",
+ "fileVersion": "5.3.4.2778"
+ }
+ }
+ },
+ "Scriban/5.12.0": {
+ "runtime": {
+ "lib/net7.0/Scriban.dll": {
+ "assemblyVersion": "5.0.0.0",
+ "fileVersion": "5.12.0.0"
+ }
+ }
+ },
+ "System.Collections/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Diagnostics.Debug/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Diagnostics.Tools/4.0.1": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Globalization/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.IO/4.1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Text.Encoding": "4.0.11",
+ "System.Threading.Tasks": "4.0.11"
+ }
+ },
+ "System.Linq/4.1.0": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0"
+ }
+ },
+ "System.Linq.Expressions/4.1.0": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Globalization": "4.0.11",
+ "System.IO": "4.1.0",
+ "System.Linq": "4.1.0",
+ "System.ObjectModel": "4.0.12",
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Emit": "4.0.1",
+ "System.Reflection.Emit.ILGeneration": "4.0.1",
+ "System.Reflection.Emit.Lightweight": "4.0.1",
+ "System.Reflection.Extensions": "4.0.1",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Reflection.TypeExtensions": "4.1.0",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Threading": "4.0.11"
+ }
+ },
+ "System.ObjectModel/4.0.12": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Threading": "4.0.11"
+ }
+ },
+ "System.Reflection/4.1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.IO": "4.1.0",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Emit/4.0.1": {
+ "dependencies": {
+ "System.IO": "4.1.0",
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Emit.ILGeneration": "4.0.1",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Emit.ILGeneration/4.0.1": {
+ "dependencies": {
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Emit.Lightweight/4.0.1": {
+ "dependencies": {
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Emit.ILGeneration": "4.0.1",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Extensions/4.0.1": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Reflection": "4.1.0",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Primitives/4.0.1": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.TypeExtensions/4.1.0": {
+ "dependencies": {
+ "System.Reflection": "4.1.0",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Resources.ResourceManager/4.0.1": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Globalization": "4.0.11",
+ "System.Reflection": "4.1.0",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Runtime/4.1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1"
+ }
+ },
+ "System.Runtime.Extensions/4.1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Runtime.Serialization.Primitives/4.1.1": {
+ "dependencies": {
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Text.Encoding/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Text.Encoding.Extensions/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Text.Encoding": "4.0.11"
+ }
+ },
+ "System.Text.RegularExpressions/4.1.0": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Globalization": "4.0.11",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Threading": "4.0.11"
+ }
+ },
+ "System.Threading/4.0.11": {
+ "dependencies": {
+ "System.Runtime": "4.1.0",
+ "System.Threading.Tasks": "4.0.11"
+ }
+ },
+ "System.Threading.Tasks/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "Ude.NetStandard/1.2.0": {
+ "runtime": {
+ "lib/netstandard2.0/Ude.NetStandard.dll": {
+ "assemblyVersion": "1.0.2.0",
+ "fileVersion": "1.0.2.0"
+ }
+ }
+ },
+ "YamlDotNet.NetCore/1.0.0": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Diagnostics.Tools": "4.0.1",
+ "System.Globalization": "4.0.11",
+ "System.Linq": "4.1.0",
+ "System.Linq.Expressions": "4.1.0",
+ "System.ObjectModel": "4.0.12",
+ "System.Reflection.Extensions": "4.0.1",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Runtime.Serialization.Primitives": "4.1.1",
+ "System.Text.Encoding.Extensions": "4.0.11",
+ "System.Text.RegularExpressions": "4.1.0"
+ },
+ "runtime": {
+ "lib/netstandard1.0/YamlDotNet.NetCore.dll": {
+ "assemblyVersion": "0.0.1.0",
+ "fileVersion": "0.0.0.0"
+ }
+ }
+ },
+ "Luban.Core/1.0.0": {
+ "dependencies": {
+ "NLog": "5.3.4",
+ "Scriban": "5.12.0"
+ },
+ "runtime": {
+ "Luban.Core.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ },
+ "Luban.DataLoader.Builtin/1.0.0": {
+ "dependencies": {
+ "ExcelDataReader": "3.7.0",
+ "Luban.Core": "1.0.0",
+ "NeoLua": "1.3.14",
+ "Ude.NetStandard": "1.2.0",
+ "YamlDotNet.NetCore": "1.0.0"
+ },
+ "runtime": {
+ "Luban.DataLoader.Builtin.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ }
+ }
+ },
+ "libraries": {
+ "Luban.Schema.Builtin/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "ExcelDataReader/3.7.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-AMv3oDETRHSRyXC17rBtKH45qIfFyo433LMeaMB3u4RNr/c9Luuc0Z+JMP6+3Cx9n4wXqFqcrEIVxrf/GgYnZg==",
+ "path": "exceldatareader/3.7.0",
+ "hashPath": "exceldatareader.3.7.0.nupkg.sha512"
+ },
+ "Microsoft.CSharp/4.5.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-kaj6Wb4qoMuH3HySFJhxwQfe8R/sJsNJnANrvv8WdFPMoNbKY5htfNscv+LHCu5ipz+49m2e+WQXpLXr9XYemQ==",
+ "path": "microsoft.csharp/4.5.0",
+ "hashPath": "microsoft.csharp.4.5.0.nupkg.sha512"
+ },
+ "Microsoft.NETCore.Platforms/1.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-2G6OjjJzwBfNOO8myRV/nFrbTw5iA+DEm0N+qUqhrOmaVtn4pC77h38I1jsXGw5VH55+dPfQsqHD0We9sCl9FQ==",
+ "path": "microsoft.netcore.platforms/1.0.1",
+ "hashPath": "microsoft.netcore.platforms.1.0.1.nupkg.sha512"
+ },
+ "Microsoft.NETCore.Targets/1.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-rkn+fKobF/cbWfnnfBOQHKVKIOpxMZBvlSHkqDWgBpwGDcLRduvs3D9OLGeV6GWGvVwNlVi2CBbTjuPmtHvyNw==",
+ "path": "microsoft.netcore.targets/1.0.1",
+ "hashPath": "microsoft.netcore.targets.1.0.1.nupkg.sha512"
+ },
+ "NeoLua/1.3.14": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-BXIUN+ePY2wx3ZGiSmR8KZKD85s01pXI690orrB3u/biB8R0nalziGw+iGbPBq1Cuz8Upggpw2ERF84POXWTCQ==",
+ "path": "neolua/1.3.14",
+ "hashPath": "neolua.1.3.14.nupkg.sha512"
+ },
+ "NLog/5.3.4": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-gLy7+O1hEYJXIlcTr1/VWjGXrZTQFZzYNO18IWasD64pNwz0BreV+nHLxWKXWZzERRzoKnsk2XYtwLkTVk7J1A==",
+ "path": "nlog/5.3.4",
+ "hashPath": "nlog.5.3.4.nupkg.sha512"
+ },
+ "Scriban/5.12.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-/YTTCxjBIpfwX3MKMT4JMFVl1jX4IHW7zih+Bg3cTIkzGnbFt+B3l/k90ILDw6DRiFE7T+VxEyls7zk4p029ng==",
+ "path": "scriban/5.12.0",
+ "hashPath": "scriban.5.12.0.nupkg.sha512"
+ },
+ "System.Collections/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-YUJGz6eFKqS0V//mLt25vFGrrCvOnsXjlvFQs+KimpwNxug9x0Pzy4PlFMU3Q2IzqAa9G2L4LsK3+9vCBK7oTg==",
+ "path": "system.collections/4.0.11",
+ "hashPath": "system.collections.4.0.11.nupkg.sha512"
+ },
+ "System.Diagnostics.Debug/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-w5U95fVKHY4G8ASs/K5iK3J5LY+/dLFd4vKejsnI/ZhBsWS9hQakfx3Zr7lRWKg4tAw9r4iktyvsTagWkqYCiw==",
+ "path": "system.diagnostics.debug/4.0.11",
+ "hashPath": "system.diagnostics.debug.4.0.11.nupkg.sha512"
+ },
+ "System.Diagnostics.Tools/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-xBfJ8pnd4C17dWaC9FM6aShzbJcRNMChUMD42I6772KGGrqaFdumwhn9OdM68erj1ueNo3xdQ1EwiFjK5k8p0g==",
+ "path": "system.diagnostics.tools/4.0.1",
+ "hashPath": "system.diagnostics.tools.4.0.1.nupkg.sha512"
+ },
+ "System.Globalization/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-B95h0YLEL2oSnwF/XjqSWKnwKOy/01VWkNlsCeMTFJLLabflpGV26nK164eRs5GiaRSBGpOxQ3pKoSnnyZN5pg==",
+ "path": "system.globalization/4.0.11",
+ "hashPath": "system.globalization.4.0.11.nupkg.sha512"
+ },
+ "System.IO/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-3KlTJceQc3gnGIaHZ7UBZO26SHL1SHE4ddrmiwumFnId+CEHP+O8r386tZKaE6zlk5/mF8vifMBzHj9SaXN+mQ==",
+ "path": "system.io/4.1.0",
+ "hashPath": "system.io.4.1.0.nupkg.sha512"
+ },
+ "System.Linq/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-bQ0iYFOQI0nuTnt+NQADns6ucV4DUvMdwN6CbkB1yj8i7arTGiTN5eok1kQwdnnNWSDZfIUySQY+J3d5KjWn0g==",
+ "path": "system.linq/4.1.0",
+ "hashPath": "system.linq.4.1.0.nupkg.sha512"
+ },
+ "System.Linq.Expressions/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-I+y02iqkgmCAyfbqOmSDOgqdZQ5tTj80Akm5BPSS8EeB0VGWdy6X1KCoYe8Pk6pwDoAKZUOdLVxnTJcExiv5zw==",
+ "path": "system.linq.expressions/4.1.0",
+ "hashPath": "system.linq.expressions.4.1.0.nupkg.sha512"
+ },
+ "System.ObjectModel/4.0.12": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-tAgJM1xt3ytyMoW4qn4wIqgJYm7L7TShRZG4+Q4Qsi2PCcj96pXN7nRywS9KkB3p/xDUjc2HSwP9SROyPYDYKQ==",
+ "path": "system.objectmodel/4.0.12",
+ "hashPath": "system.objectmodel.4.0.12.nupkg.sha512"
+ },
+ "System.Reflection/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-JCKANJ0TI7kzoQzuwB/OoJANy1Lg338B6+JVacPl4TpUwi3cReg3nMLplMq2uqYfHFQpKIlHAUVAJlImZz/4ng==",
+ "path": "system.reflection/4.1.0",
+ "hashPath": "system.reflection.4.1.0.nupkg.sha512"
+ },
+ "System.Reflection.Emit/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-P2wqAj72fFjpP6wb9nSfDqNBMab+2ovzSDzUZK7MVIm54tBJEPr9jWfSjjoTpPwj1LeKcmX3vr0ttyjSSFM47g==",
+ "path": "system.reflection.emit/4.0.1",
+ "hashPath": "system.reflection.emit.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.Emit.ILGeneration/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-Ov6dU8Bu15Bc7zuqttgHF12J5lwSWyTf1S+FJouUXVMSqImLZzYaQ+vRr1rQ0OZ0HqsrwWl4dsKHELckQkVpgA==",
+ "path": "system.reflection.emit.ilgeneration/4.0.1",
+ "hashPath": "system.reflection.emit.ilgeneration.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.Emit.Lightweight/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-sSzHHXueZ5Uh0OLpUQprhr+ZYJrLPA2Cmr4gn0wj9+FftNKXx8RIMKvO9qnjk2ebPYUjZ+F2ulGdPOsvj+MEjA==",
+ "path": "system.reflection.emit.lightweight/4.0.1",
+ "hashPath": "system.reflection.emit.lightweight.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.Extensions/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-GYrtRsZcMuHF3sbmRHfMYpvxZoIN2bQGrYGerUiWLEkqdEUQZhH3TRSaC/oI4wO0II1RKBPlpIa1TOMxIcOOzQ==",
+ "path": "system.reflection.extensions/4.0.1",
+ "hashPath": "system.reflection.extensions.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.Primitives/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-4inTox4wTBaDhB7V3mPvp9XlCbeGYWVEM9/fXALd52vNEAVisc1BoVWQPuUuD0Ga//dNbA/WeMy9u9mzLxGTHQ==",
+ "path": "system.reflection.primitives/4.0.1",
+ "hashPath": "system.reflection.primitives.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.TypeExtensions/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-tsQ/ptQ3H5FYfON8lL4MxRk/8kFyE0A+tGPXmVP967cT/gzLHYxIejIYSxp4JmIeFHVP78g/F2FE1mUUTbDtrg==",
+ "path": "system.reflection.typeextensions/4.1.0",
+ "hashPath": "system.reflection.typeextensions.4.1.0.nupkg.sha512"
+ },
+ "System.Resources.ResourceManager/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-TxwVeUNoTgUOdQ09gfTjvW411MF+w9MBYL7AtNVc+HtBCFlutPLhUCdZjNkjbhj3bNQWMdHboF0KIWEOjJssbA==",
+ "path": "system.resources.resourcemanager/4.0.1",
+ "hashPath": "system.resources.resourcemanager.4.0.1.nupkg.sha512"
+ },
+ "System.Runtime/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-v6c/4Yaa9uWsq+JMhnOFewrYkgdNHNG2eMKuNqRn8P733rNXeRCGvV5FkkjBXn2dbVkPXOsO0xjsEeM1q2zC0g==",
+ "path": "system.runtime/4.1.0",
+ "hashPath": "system.runtime.4.1.0.nupkg.sha512"
+ },
+ "System.Runtime.Extensions/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-CUOHjTT/vgP0qGW22U4/hDlOqXmcPq5YicBaXdUR2UiUoLwBT+olO6we4DVbq57jeX5uXH2uerVZhf0qGj+sVQ==",
+ "path": "system.runtime.extensions/4.1.0",
+ "hashPath": "system.runtime.extensions.4.1.0.nupkg.sha512"
+ },
+ "System.Runtime.Serialization.Primitives/4.1.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-HZ6Du5QrTG8MNJbf4e4qMO3JRAkIboGT5Fk804uZtg3Gq516S7hAqTm2UZKUHa7/6HUGdVy3AqMQKbns06G/cg==",
+ "path": "system.runtime.serialization.primitives/4.1.1",
+ "hashPath": "system.runtime.serialization.primitives.4.1.1.nupkg.sha512"
+ },
+ "System.Text.Encoding/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-U3gGeMlDZXxCEiY4DwVLSacg+DFWCvoiX+JThA/rvw37Sqrku7sEFeVBBBMBnfB6FeZHsyDx85HlKL19x0HtZA==",
+ "path": "system.text.encoding/4.0.11",
+ "hashPath": "system.text.encoding.4.0.11.nupkg.sha512"
+ },
+ "System.Text.Encoding.Extensions/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-jtbiTDtvfLYgXn8PTfWI+SiBs51rrmO4AAckx4KR6vFK9Wzf6tI8kcRdsYQNwriUeQ1+CtQbM1W4cMbLXnj/OQ==",
+ "path": "system.text.encoding.extensions/4.0.11",
+ "hashPath": "system.text.encoding.extensions.4.0.11.nupkg.sha512"
+ },
+ "System.Text.RegularExpressions/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-i88YCXpRTjCnoSQZtdlHkAOx4KNNik4hMy83n0+Ftlb7jvV6ZiZWMpnEZHhjBp6hQVh8gWd/iKNPzlPF7iyA2g==",
+ "path": "system.text.regularexpressions/4.1.0",
+ "hashPath": "system.text.regularexpressions.4.1.0.nupkg.sha512"
+ },
+ "System.Threading/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-N+3xqIcg3VDKyjwwCGaZ9HawG9aC6cSDI+s7ROma310GQo8vilFZa86hqKppwTHleR/G0sfOzhvgnUxWCR/DrQ==",
+ "path": "system.threading/4.0.11",
+ "hashPath": "system.threading.4.0.11.nupkg.sha512"
+ },
+ "System.Threading.Tasks/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-k1S4Gc6IGwtHGT8188RSeGaX86Qw/wnrgNLshJvsdNUOPP9etMmo8S07c+UlOAx4K/xLuN9ivA1bD0LVurtIxQ==",
+ "path": "system.threading.tasks/4.0.11",
+ "hashPath": "system.threading.tasks.4.0.11.nupkg.sha512"
+ },
+ "Ude.NetStandard/1.2.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-zRWpPAxBg3lNdm4UiKixTe+DFPoNid9CILggTCy/0WR2WKETe17kTWhiiIpLB2k5IEgnvA0QLfKlvd6Tvu0pzA==",
+ "path": "ude.netstandard/1.2.0",
+ "hashPath": "ude.netstandard.1.2.0.nupkg.sha512"
+ },
+ "YamlDotNet.NetCore/1.0.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-vPiKF4Yf02MS96Nzwcr8+WrvlhTx+camOgUzxhazU0hCzs2ESetWDCxaIT/MYdAw2oONYem1ow9PXWJjHkRUDw==",
+ "path": "yamldotnet.netcore/1.0.0",
+ "hashPath": "yamldotnet.netcore.1.0.0.nupkg.sha512"
+ },
+ "Luban.Core/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "Luban.DataLoader.Builtin/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ }
+ }
+}
\ No newline at end of file
diff --git a/Config/Tools/Luban/Luban.Schema.Builtin.dll b/Config/Tools/Luban/Luban.Schema.Builtin.dll
new file mode 100644
index 0000000..25a559d
Binary files /dev/null and b/Config/Tools/Luban/Luban.Schema.Builtin.dll differ
diff --git a/Config/Tools/Luban/Luban.Schema.Builtin.runtimeconfig.json b/Config/Tools/Luban/Luban.Schema.Builtin.runtimeconfig.json
new file mode 100644
index 0000000..4466502
--- /dev/null
+++ b/Config/Tools/Luban/Luban.Schema.Builtin.runtimeconfig.json
@@ -0,0 +1,14 @@
+{
+ "runtimeOptions": {
+ "tfm": "net8.0",
+ "rollForward": "LatestMinor",
+ "framework": {
+ "name": "Microsoft.NETCore.App",
+ "version": "8.0.0"
+ },
+ "configProperties": {
+ "System.Reflection.Metadata.MetadataUpdater.IsSupported": false,
+ "System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false
+ }
+ }
+}
\ No newline at end of file
diff --git a/Config/Tools/Luban/Luban.Typescript.deps.json b/Config/Tools/Luban/Luban.Typescript.deps.json
new file mode 100644
index 0000000..e5855b0
--- /dev/null
+++ b/Config/Tools/Luban/Luban.Typescript.deps.json
@@ -0,0 +1,615 @@
+{
+ "runtimeTarget": {
+ "name": ".NETCoreApp,Version=v8.0",
+ "signature": ""
+ },
+ "compilationOptions": {},
+ "targets": {
+ ".NETCoreApp,Version=v8.0": {
+ "Luban.Typescript/1.0.0": {
+ "dependencies": {
+ "Luban.CSharp": "1.0.0",
+ "Luban.Core": "1.0.0",
+ "Luban.DataTarget.Builtin": "1.0.0"
+ },
+ "runtime": {
+ "Luban.Typescript.dll": {}
+ }
+ },
+ "ExcelDataReader/3.7.0": {
+ "runtime": {
+ "lib/netstandard2.1/ExcelDataReader.dll": {
+ "assemblyVersion": "3.7.0.0",
+ "fileVersion": "3.7.0.0"
+ }
+ }
+ },
+ "Microsoft.CSharp/4.5.0": {},
+ "Microsoft.NETCore.Platforms/1.0.1": {},
+ "Microsoft.NETCore.Targets/1.0.1": {},
+ "NeoLua/1.3.14": {
+ "dependencies": {
+ "Microsoft.CSharp": "4.5.0"
+ },
+ "runtime": {
+ "lib/net5.0/Neo.Lua.dll": {
+ "assemblyVersion": "5.3.0.0",
+ "fileVersion": "1.3.14.0"
+ }
+ },
+ "resources": {
+ "lib/net5.0/de/Neo.Lua.resources.dll": {
+ "locale": "de"
+ }
+ }
+ },
+ "NLog/5.3.4": {
+ "runtime": {
+ "lib/netstandard2.0/NLog.dll": {
+ "assemblyVersion": "5.0.0.0",
+ "fileVersion": "5.3.4.2778"
+ }
+ }
+ },
+ "Scriban/5.12.0": {
+ "runtime": {
+ "lib/net7.0/Scriban.dll": {
+ "assemblyVersion": "5.0.0.0",
+ "fileVersion": "5.12.0.0"
+ }
+ }
+ },
+ "System.Collections/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Diagnostics.Debug/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Diagnostics.Tools/4.0.1": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Globalization/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.IO/4.1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Text.Encoding": "4.0.11",
+ "System.Threading.Tasks": "4.0.11"
+ }
+ },
+ "System.Linq/4.1.0": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0"
+ }
+ },
+ "System.Linq.Expressions/4.1.0": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Globalization": "4.0.11",
+ "System.IO": "4.1.0",
+ "System.Linq": "4.1.0",
+ "System.ObjectModel": "4.0.12",
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Emit": "4.0.1",
+ "System.Reflection.Emit.ILGeneration": "4.0.1",
+ "System.Reflection.Emit.Lightweight": "4.0.1",
+ "System.Reflection.Extensions": "4.0.1",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Reflection.TypeExtensions": "4.1.0",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Threading": "4.0.11"
+ }
+ },
+ "System.ObjectModel/4.0.12": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Threading": "4.0.11"
+ }
+ },
+ "System.Reflection/4.1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.IO": "4.1.0",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Emit/4.0.1": {
+ "dependencies": {
+ "System.IO": "4.1.0",
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Emit.ILGeneration": "4.0.1",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Emit.ILGeneration/4.0.1": {
+ "dependencies": {
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Emit.Lightweight/4.0.1": {
+ "dependencies": {
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Emit.ILGeneration": "4.0.1",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Extensions/4.0.1": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Reflection": "4.1.0",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Primitives/4.0.1": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.TypeExtensions/4.1.0": {
+ "dependencies": {
+ "System.Reflection": "4.1.0",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Resources.ResourceManager/4.0.1": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Globalization": "4.0.11",
+ "System.Reflection": "4.1.0",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Runtime/4.1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1"
+ }
+ },
+ "System.Runtime.Extensions/4.1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Runtime.Serialization.Primitives/4.1.1": {
+ "dependencies": {
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Text.Encoding/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Text.Encoding.Extensions/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Text.Encoding": "4.0.11"
+ }
+ },
+ "System.Text.RegularExpressions/4.1.0": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Globalization": "4.0.11",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Threading": "4.0.11"
+ }
+ },
+ "System.Threading/4.0.11": {
+ "dependencies": {
+ "System.Runtime": "4.1.0",
+ "System.Threading.Tasks": "4.0.11"
+ }
+ },
+ "System.Threading.Tasks/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "Ude.NetStandard/1.2.0": {
+ "runtime": {
+ "lib/netstandard2.0/Ude.NetStandard.dll": {
+ "assemblyVersion": "1.0.2.0",
+ "fileVersion": "1.0.2.0"
+ }
+ }
+ },
+ "YamlDotNet.NetCore/1.0.0": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Diagnostics.Tools": "4.0.1",
+ "System.Globalization": "4.0.11",
+ "System.Linq": "4.1.0",
+ "System.Linq.Expressions": "4.1.0",
+ "System.ObjectModel": "4.0.12",
+ "System.Reflection.Extensions": "4.0.1",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Runtime.Serialization.Primitives": "4.1.1",
+ "System.Text.Encoding.Extensions": "4.0.11",
+ "System.Text.RegularExpressions": "4.1.0"
+ },
+ "runtime": {
+ "lib/netstandard1.0/YamlDotNet.NetCore.dll": {
+ "assemblyVersion": "0.0.1.0",
+ "fileVersion": "0.0.0.0"
+ }
+ }
+ },
+ "Luban.Core/1.0.0": {
+ "dependencies": {
+ "NLog": "5.3.4",
+ "Scriban": "5.12.0"
+ },
+ "runtime": {
+ "Luban.Core.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ },
+ "Luban.CSharp/1.0.0": {
+ "dependencies": {
+ "Luban.Core": "1.0.0",
+ "Luban.DataValidator.Builtin": "1.0.0"
+ },
+ "runtime": {
+ "Luban.CSharp.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ },
+ "Luban.DataLoader.Builtin/1.0.0": {
+ "dependencies": {
+ "ExcelDataReader": "3.7.0",
+ "Luban.Core": "1.0.0",
+ "NeoLua": "1.3.14",
+ "Ude.NetStandard": "1.2.0",
+ "YamlDotNet.NetCore": "1.0.0"
+ },
+ "runtime": {
+ "Luban.DataLoader.Builtin.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ },
+ "Luban.DataTarget.Builtin/1.0.0": {
+ "dependencies": {
+ "Luban.Core": "1.0.0",
+ "Luban.DataLoader.Builtin": "1.0.0"
+ },
+ "runtime": {
+ "Luban.DataTarget.Builtin.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ },
+ "Luban.DataValidator.Builtin/1.0.0": {
+ "dependencies": {
+ "Luban.Core": "1.0.0"
+ },
+ "runtime": {
+ "Luban.DataValidator.Builtin.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ }
+ }
+ },
+ "libraries": {
+ "Luban.Typescript/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "ExcelDataReader/3.7.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-AMv3oDETRHSRyXC17rBtKH45qIfFyo433LMeaMB3u4RNr/c9Luuc0Z+JMP6+3Cx9n4wXqFqcrEIVxrf/GgYnZg==",
+ "path": "exceldatareader/3.7.0",
+ "hashPath": "exceldatareader.3.7.0.nupkg.sha512"
+ },
+ "Microsoft.CSharp/4.5.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-kaj6Wb4qoMuH3HySFJhxwQfe8R/sJsNJnANrvv8WdFPMoNbKY5htfNscv+LHCu5ipz+49m2e+WQXpLXr9XYemQ==",
+ "path": "microsoft.csharp/4.5.0",
+ "hashPath": "microsoft.csharp.4.5.0.nupkg.sha512"
+ },
+ "Microsoft.NETCore.Platforms/1.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-2G6OjjJzwBfNOO8myRV/nFrbTw5iA+DEm0N+qUqhrOmaVtn4pC77h38I1jsXGw5VH55+dPfQsqHD0We9sCl9FQ==",
+ "path": "microsoft.netcore.platforms/1.0.1",
+ "hashPath": "microsoft.netcore.platforms.1.0.1.nupkg.sha512"
+ },
+ "Microsoft.NETCore.Targets/1.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-rkn+fKobF/cbWfnnfBOQHKVKIOpxMZBvlSHkqDWgBpwGDcLRduvs3D9OLGeV6GWGvVwNlVi2CBbTjuPmtHvyNw==",
+ "path": "microsoft.netcore.targets/1.0.1",
+ "hashPath": "microsoft.netcore.targets.1.0.1.nupkg.sha512"
+ },
+ "NeoLua/1.3.14": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-BXIUN+ePY2wx3ZGiSmR8KZKD85s01pXI690orrB3u/biB8R0nalziGw+iGbPBq1Cuz8Upggpw2ERF84POXWTCQ==",
+ "path": "neolua/1.3.14",
+ "hashPath": "neolua.1.3.14.nupkg.sha512"
+ },
+ "NLog/5.3.4": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-gLy7+O1hEYJXIlcTr1/VWjGXrZTQFZzYNO18IWasD64pNwz0BreV+nHLxWKXWZzERRzoKnsk2XYtwLkTVk7J1A==",
+ "path": "nlog/5.3.4",
+ "hashPath": "nlog.5.3.4.nupkg.sha512"
+ },
+ "Scriban/5.12.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-/YTTCxjBIpfwX3MKMT4JMFVl1jX4IHW7zih+Bg3cTIkzGnbFt+B3l/k90ILDw6DRiFE7T+VxEyls7zk4p029ng==",
+ "path": "scriban/5.12.0",
+ "hashPath": "scriban.5.12.0.nupkg.sha512"
+ },
+ "System.Collections/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-YUJGz6eFKqS0V//mLt25vFGrrCvOnsXjlvFQs+KimpwNxug9x0Pzy4PlFMU3Q2IzqAa9G2L4LsK3+9vCBK7oTg==",
+ "path": "system.collections/4.0.11",
+ "hashPath": "system.collections.4.0.11.nupkg.sha512"
+ },
+ "System.Diagnostics.Debug/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-w5U95fVKHY4G8ASs/K5iK3J5LY+/dLFd4vKejsnI/ZhBsWS9hQakfx3Zr7lRWKg4tAw9r4iktyvsTagWkqYCiw==",
+ "path": "system.diagnostics.debug/4.0.11",
+ "hashPath": "system.diagnostics.debug.4.0.11.nupkg.sha512"
+ },
+ "System.Diagnostics.Tools/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-xBfJ8pnd4C17dWaC9FM6aShzbJcRNMChUMD42I6772KGGrqaFdumwhn9OdM68erj1ueNo3xdQ1EwiFjK5k8p0g==",
+ "path": "system.diagnostics.tools/4.0.1",
+ "hashPath": "system.diagnostics.tools.4.0.1.nupkg.sha512"
+ },
+ "System.Globalization/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-B95h0YLEL2oSnwF/XjqSWKnwKOy/01VWkNlsCeMTFJLLabflpGV26nK164eRs5GiaRSBGpOxQ3pKoSnnyZN5pg==",
+ "path": "system.globalization/4.0.11",
+ "hashPath": "system.globalization.4.0.11.nupkg.sha512"
+ },
+ "System.IO/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-3KlTJceQc3gnGIaHZ7UBZO26SHL1SHE4ddrmiwumFnId+CEHP+O8r386tZKaE6zlk5/mF8vifMBzHj9SaXN+mQ==",
+ "path": "system.io/4.1.0",
+ "hashPath": "system.io.4.1.0.nupkg.sha512"
+ },
+ "System.Linq/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-bQ0iYFOQI0nuTnt+NQADns6ucV4DUvMdwN6CbkB1yj8i7arTGiTN5eok1kQwdnnNWSDZfIUySQY+J3d5KjWn0g==",
+ "path": "system.linq/4.1.0",
+ "hashPath": "system.linq.4.1.0.nupkg.sha512"
+ },
+ "System.Linq.Expressions/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-I+y02iqkgmCAyfbqOmSDOgqdZQ5tTj80Akm5BPSS8EeB0VGWdy6X1KCoYe8Pk6pwDoAKZUOdLVxnTJcExiv5zw==",
+ "path": "system.linq.expressions/4.1.0",
+ "hashPath": "system.linq.expressions.4.1.0.nupkg.sha512"
+ },
+ "System.ObjectModel/4.0.12": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-tAgJM1xt3ytyMoW4qn4wIqgJYm7L7TShRZG4+Q4Qsi2PCcj96pXN7nRywS9KkB3p/xDUjc2HSwP9SROyPYDYKQ==",
+ "path": "system.objectmodel/4.0.12",
+ "hashPath": "system.objectmodel.4.0.12.nupkg.sha512"
+ },
+ "System.Reflection/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-JCKANJ0TI7kzoQzuwB/OoJANy1Lg338B6+JVacPl4TpUwi3cReg3nMLplMq2uqYfHFQpKIlHAUVAJlImZz/4ng==",
+ "path": "system.reflection/4.1.0",
+ "hashPath": "system.reflection.4.1.0.nupkg.sha512"
+ },
+ "System.Reflection.Emit/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-P2wqAj72fFjpP6wb9nSfDqNBMab+2ovzSDzUZK7MVIm54tBJEPr9jWfSjjoTpPwj1LeKcmX3vr0ttyjSSFM47g==",
+ "path": "system.reflection.emit/4.0.1",
+ "hashPath": "system.reflection.emit.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.Emit.ILGeneration/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-Ov6dU8Bu15Bc7zuqttgHF12J5lwSWyTf1S+FJouUXVMSqImLZzYaQ+vRr1rQ0OZ0HqsrwWl4dsKHELckQkVpgA==",
+ "path": "system.reflection.emit.ilgeneration/4.0.1",
+ "hashPath": "system.reflection.emit.ilgeneration.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.Emit.Lightweight/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-sSzHHXueZ5Uh0OLpUQprhr+ZYJrLPA2Cmr4gn0wj9+FftNKXx8RIMKvO9qnjk2ebPYUjZ+F2ulGdPOsvj+MEjA==",
+ "path": "system.reflection.emit.lightweight/4.0.1",
+ "hashPath": "system.reflection.emit.lightweight.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.Extensions/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-GYrtRsZcMuHF3sbmRHfMYpvxZoIN2bQGrYGerUiWLEkqdEUQZhH3TRSaC/oI4wO0II1RKBPlpIa1TOMxIcOOzQ==",
+ "path": "system.reflection.extensions/4.0.1",
+ "hashPath": "system.reflection.extensions.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.Primitives/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-4inTox4wTBaDhB7V3mPvp9XlCbeGYWVEM9/fXALd52vNEAVisc1BoVWQPuUuD0Ga//dNbA/WeMy9u9mzLxGTHQ==",
+ "path": "system.reflection.primitives/4.0.1",
+ "hashPath": "system.reflection.primitives.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.TypeExtensions/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-tsQ/ptQ3H5FYfON8lL4MxRk/8kFyE0A+tGPXmVP967cT/gzLHYxIejIYSxp4JmIeFHVP78g/F2FE1mUUTbDtrg==",
+ "path": "system.reflection.typeextensions/4.1.0",
+ "hashPath": "system.reflection.typeextensions.4.1.0.nupkg.sha512"
+ },
+ "System.Resources.ResourceManager/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-TxwVeUNoTgUOdQ09gfTjvW411MF+w9MBYL7AtNVc+HtBCFlutPLhUCdZjNkjbhj3bNQWMdHboF0KIWEOjJssbA==",
+ "path": "system.resources.resourcemanager/4.0.1",
+ "hashPath": "system.resources.resourcemanager.4.0.1.nupkg.sha512"
+ },
+ "System.Runtime/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-v6c/4Yaa9uWsq+JMhnOFewrYkgdNHNG2eMKuNqRn8P733rNXeRCGvV5FkkjBXn2dbVkPXOsO0xjsEeM1q2zC0g==",
+ "path": "system.runtime/4.1.0",
+ "hashPath": "system.runtime.4.1.0.nupkg.sha512"
+ },
+ "System.Runtime.Extensions/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-CUOHjTT/vgP0qGW22U4/hDlOqXmcPq5YicBaXdUR2UiUoLwBT+olO6we4DVbq57jeX5uXH2uerVZhf0qGj+sVQ==",
+ "path": "system.runtime.extensions/4.1.0",
+ "hashPath": "system.runtime.extensions.4.1.0.nupkg.sha512"
+ },
+ "System.Runtime.Serialization.Primitives/4.1.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-HZ6Du5QrTG8MNJbf4e4qMO3JRAkIboGT5Fk804uZtg3Gq516S7hAqTm2UZKUHa7/6HUGdVy3AqMQKbns06G/cg==",
+ "path": "system.runtime.serialization.primitives/4.1.1",
+ "hashPath": "system.runtime.serialization.primitives.4.1.1.nupkg.sha512"
+ },
+ "System.Text.Encoding/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-U3gGeMlDZXxCEiY4DwVLSacg+DFWCvoiX+JThA/rvw37Sqrku7sEFeVBBBMBnfB6FeZHsyDx85HlKL19x0HtZA==",
+ "path": "system.text.encoding/4.0.11",
+ "hashPath": "system.text.encoding.4.0.11.nupkg.sha512"
+ },
+ "System.Text.Encoding.Extensions/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-jtbiTDtvfLYgXn8PTfWI+SiBs51rrmO4AAckx4KR6vFK9Wzf6tI8kcRdsYQNwriUeQ1+CtQbM1W4cMbLXnj/OQ==",
+ "path": "system.text.encoding.extensions/4.0.11",
+ "hashPath": "system.text.encoding.extensions.4.0.11.nupkg.sha512"
+ },
+ "System.Text.RegularExpressions/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-i88YCXpRTjCnoSQZtdlHkAOx4KNNik4hMy83n0+Ftlb7jvV6ZiZWMpnEZHhjBp6hQVh8gWd/iKNPzlPF7iyA2g==",
+ "path": "system.text.regularexpressions/4.1.0",
+ "hashPath": "system.text.regularexpressions.4.1.0.nupkg.sha512"
+ },
+ "System.Threading/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-N+3xqIcg3VDKyjwwCGaZ9HawG9aC6cSDI+s7ROma310GQo8vilFZa86hqKppwTHleR/G0sfOzhvgnUxWCR/DrQ==",
+ "path": "system.threading/4.0.11",
+ "hashPath": "system.threading.4.0.11.nupkg.sha512"
+ },
+ "System.Threading.Tasks/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-k1S4Gc6IGwtHGT8188RSeGaX86Qw/wnrgNLshJvsdNUOPP9etMmo8S07c+UlOAx4K/xLuN9ivA1bD0LVurtIxQ==",
+ "path": "system.threading.tasks/4.0.11",
+ "hashPath": "system.threading.tasks.4.0.11.nupkg.sha512"
+ },
+ "Ude.NetStandard/1.2.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-zRWpPAxBg3lNdm4UiKixTe+DFPoNid9CILggTCy/0WR2WKETe17kTWhiiIpLB2k5IEgnvA0QLfKlvd6Tvu0pzA==",
+ "path": "ude.netstandard/1.2.0",
+ "hashPath": "ude.netstandard.1.2.0.nupkg.sha512"
+ },
+ "YamlDotNet.NetCore/1.0.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-vPiKF4Yf02MS96Nzwcr8+WrvlhTx+camOgUzxhazU0hCzs2ESetWDCxaIT/MYdAw2oONYem1ow9PXWJjHkRUDw==",
+ "path": "yamldotnet.netcore/1.0.0",
+ "hashPath": "yamldotnet.netcore.1.0.0.nupkg.sha512"
+ },
+ "Luban.Core/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "Luban.CSharp/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "Luban.DataLoader.Builtin/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "Luban.DataTarget.Builtin/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "Luban.DataValidator.Builtin/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ }
+ }
+}
\ No newline at end of file
diff --git a/Config/Tools/Luban/Luban.Typescript.dll b/Config/Tools/Luban/Luban.Typescript.dll
new file mode 100644
index 0000000..40668fc
Binary files /dev/null and b/Config/Tools/Luban/Luban.Typescript.dll differ
diff --git a/Config/Tools/Luban/Luban.deps.json b/Config/Tools/Luban/Luban.deps.json
new file mode 100644
index 0000000..fcc88c9
--- /dev/null
+++ b/Config/Tools/Luban/Luban.deps.json
@@ -0,0 +1,1015 @@
+{
+ "runtimeTarget": {
+ "name": ".NETCoreApp,Version=v8.0",
+ "signature": ""
+ },
+ "compilationOptions": {},
+ "targets": {
+ ".NETCoreApp,Version=v8.0": {
+ "Luban/4.2.1": {
+ "dependencies": {
+ "CommandLineParser": "2.9.1",
+ "Luban.Bson": "1.0.0",
+ "Luban.CSharp": "1.0.0",
+ "Luban.Core": "1.0.0",
+ "Luban.Cpp": "1.0.0",
+ "Luban.Dart": "1.0.0",
+ "Luban.DataLoader.Builtin": "1.0.0",
+ "Luban.DataTarget.Builtin": "1.0.0",
+ "Luban.DataValidator.Builtin": "1.0.0",
+ "Luban.FlatBuffers": "1.0.0",
+ "Luban.Gdscript": "1.0.0",
+ "Luban.Golang": "1.0.0",
+ "Luban.Java": "1.0.0",
+ "Luban.L10N": "1.0.0",
+ "Luban.Lua": "1.0.0",
+ "Luban.MsgPack": "1.0.0",
+ "Luban.PHP": "1.0.0",
+ "Luban.Protobuf": "1.0.0",
+ "Luban.Python": "1.0.0",
+ "Luban.Rust": "1.0.0",
+ "Luban.Schema.Builtin": "1.0.0",
+ "Luban.Typescript": "1.0.0",
+ "YamlDotNet.NetCore": "1.0.0"
+ },
+ "runtime": {
+ "Luban.dll": {}
+ }
+ },
+ "CommandLineParser/2.9.1": {
+ "runtime": {
+ "lib/netstandard2.0/CommandLine.dll": {
+ "assemblyVersion": "2.9.1.0",
+ "fileVersion": "2.9.1.0"
+ }
+ }
+ },
+ "ExcelDataReader/3.7.0": {
+ "runtime": {
+ "lib/netstandard2.1/ExcelDataReader.dll": {
+ "assemblyVersion": "3.7.0.0",
+ "fileVersion": "3.7.0.0"
+ }
+ }
+ },
+ "Google.Protobuf/3.29.0": {
+ "runtime": {
+ "lib/net5.0/Google.Protobuf.dll": {
+ "assemblyVersion": "3.29.0.0",
+ "fileVersion": "3.29.0.0"
+ }
+ }
+ },
+ "MessagePack/2.5.192": {
+ "dependencies": {
+ "MessagePack.Annotations": "2.5.192",
+ "Microsoft.NET.StringTools": "17.6.3"
+ },
+ "runtime": {
+ "lib/net6.0/MessagePack.dll": {
+ "assemblyVersion": "2.5.0.0",
+ "fileVersion": "2.5.192.54228"
+ }
+ }
+ },
+ "MessagePack.Annotations/2.5.192": {
+ "runtime": {
+ "lib/netstandard2.0/MessagePack.Annotations.dll": {
+ "assemblyVersion": "2.5.0.0",
+ "fileVersion": "2.5.192.54228"
+ }
+ }
+ },
+ "Microsoft.CSharp/4.5.0": {},
+ "Microsoft.NET.StringTools/17.6.3": {
+ "runtime": {
+ "lib/net7.0/Microsoft.NET.StringTools.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "17.6.3.22601"
+ }
+ }
+ },
+ "Microsoft.NETCore.Platforms/1.0.1": {},
+ "Microsoft.NETCore.Targets/1.0.1": {},
+ "NeoLua/1.3.14": {
+ "dependencies": {
+ "Microsoft.CSharp": "4.5.0"
+ },
+ "runtime": {
+ "lib/net5.0/Neo.Lua.dll": {
+ "assemblyVersion": "5.3.0.0",
+ "fileVersion": "1.3.14.0"
+ }
+ },
+ "resources": {
+ "lib/net5.0/de/Neo.Lua.resources.dll": {
+ "locale": "de"
+ }
+ }
+ },
+ "Newtonsoft.Json/13.0.1": {
+ "runtime": {
+ "lib/netstandard2.0/Newtonsoft.Json.dll": {
+ "assemblyVersion": "13.0.0.0",
+ "fileVersion": "13.0.1.25517"
+ }
+ }
+ },
+ "Newtonsoft.Json.Bson/1.0.3": {
+ "dependencies": {
+ "Newtonsoft.Json": "13.0.1"
+ },
+ "runtime": {
+ "lib/netstandard2.0/Newtonsoft.Json.Bson.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.3.29904"
+ }
+ }
+ },
+ "NLog/5.3.4": {
+ "runtime": {
+ "lib/netstandard2.0/NLog.dll": {
+ "assemblyVersion": "5.0.0.0",
+ "fileVersion": "5.3.4.2778"
+ }
+ }
+ },
+ "Scriban/5.12.0": {
+ "runtime": {
+ "lib/net7.0/Scriban.dll": {
+ "assemblyVersion": "5.0.0.0",
+ "fileVersion": "5.12.0.0"
+ }
+ }
+ },
+ "System.Collections/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Diagnostics.Debug/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Diagnostics.Tools/4.0.1": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Globalization/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.IO/4.1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Text.Encoding": "4.0.11",
+ "System.Threading.Tasks": "4.0.11"
+ }
+ },
+ "System.Linq/4.1.0": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0"
+ }
+ },
+ "System.Linq.Expressions/4.1.0": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Globalization": "4.0.11",
+ "System.IO": "4.1.0",
+ "System.Linq": "4.1.0",
+ "System.ObjectModel": "4.0.12",
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Emit": "4.0.1",
+ "System.Reflection.Emit.ILGeneration": "4.0.1",
+ "System.Reflection.Emit.Lightweight": "4.0.1",
+ "System.Reflection.Extensions": "4.0.1",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Reflection.TypeExtensions": "4.1.0",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Threading": "4.0.11"
+ }
+ },
+ "System.ObjectModel/4.0.12": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Threading": "4.0.11"
+ }
+ },
+ "System.Reflection/4.1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.IO": "4.1.0",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Emit/4.0.1": {
+ "dependencies": {
+ "System.IO": "4.1.0",
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Emit.ILGeneration": "4.0.1",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Emit.ILGeneration/4.0.1": {
+ "dependencies": {
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Emit.Lightweight/4.0.1": {
+ "dependencies": {
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Emit.ILGeneration": "4.0.1",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Extensions/4.0.1": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Reflection": "4.1.0",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.Primitives/4.0.1": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Reflection.TypeExtensions/4.1.0": {
+ "dependencies": {
+ "System.Reflection": "4.1.0",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Resources.ResourceManager/4.0.1": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Globalization": "4.0.11",
+ "System.Reflection": "4.1.0",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Runtime/4.1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1"
+ }
+ },
+ "System.Runtime.Extensions/4.1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Runtime.Serialization.Primitives/4.1.1": {
+ "dependencies": {
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Text.Encoding/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Text.Encoding.Extensions/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Text.Encoding": "4.0.11"
+ }
+ },
+ "System.Text.RegularExpressions/4.1.0": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Globalization": "4.0.11",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Threading": "4.0.11"
+ }
+ },
+ "System.Threading/4.0.11": {
+ "dependencies": {
+ "System.Runtime": "4.1.0",
+ "System.Threading.Tasks": "4.0.11"
+ }
+ },
+ "System.Threading.Tasks/4.0.11": {
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "Ude.NetStandard/1.2.0": {
+ "runtime": {
+ "lib/netstandard2.0/Ude.NetStandard.dll": {
+ "assemblyVersion": "1.0.2.0",
+ "fileVersion": "1.0.2.0"
+ }
+ }
+ },
+ "YamlDotNet.NetCore/1.0.0": {
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Diagnostics.Tools": "4.0.1",
+ "System.Globalization": "4.0.11",
+ "System.Linq": "4.1.0",
+ "System.Linq.Expressions": "4.1.0",
+ "System.ObjectModel": "4.0.12",
+ "System.Reflection.Extensions": "4.0.1",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Runtime.Serialization.Primitives": "4.1.1",
+ "System.Text.Encoding.Extensions": "4.0.11",
+ "System.Text.RegularExpressions": "4.1.0"
+ },
+ "runtime": {
+ "lib/netstandard1.0/YamlDotNet.NetCore.dll": {
+ "assemblyVersion": "0.0.1.0",
+ "fileVersion": "0.0.0.0"
+ }
+ }
+ },
+ "Luban.Bson/1.0.0": {
+ "dependencies": {
+ "Luban.Core": "1.0.0",
+ "Newtonsoft.Json.Bson": "1.0.3"
+ },
+ "runtime": {
+ "Luban.Bson.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ },
+ "Luban.Core/1.0.0": {
+ "dependencies": {
+ "NLog": "5.3.4",
+ "Scriban": "5.12.0"
+ },
+ "runtime": {
+ "Luban.Core.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ },
+ "Luban.Cpp/1.0.0": {
+ "dependencies": {
+ "Luban.Core": "1.0.0"
+ },
+ "runtime": {
+ "Luban.Cpp.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ },
+ "Luban.CSharp/1.0.0": {
+ "dependencies": {
+ "Luban.Core": "1.0.0",
+ "Luban.DataValidator.Builtin": "1.0.0"
+ },
+ "runtime": {
+ "Luban.CSharp.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ },
+ "Luban.Dart/1.0.0": {
+ "dependencies": {
+ "Luban.Core": "1.0.0"
+ },
+ "runtime": {
+ "Luban.Dart.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ },
+ "Luban.DataLoader.Builtin/1.0.0": {
+ "dependencies": {
+ "ExcelDataReader": "3.7.0",
+ "Luban.Core": "1.0.0",
+ "NeoLua": "1.3.14",
+ "Ude.NetStandard": "1.2.0",
+ "YamlDotNet.NetCore": "1.0.0"
+ },
+ "runtime": {
+ "Luban.DataLoader.Builtin.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ },
+ "Luban.DataTarget.Builtin/1.0.0": {
+ "dependencies": {
+ "Luban.Core": "1.0.0",
+ "Luban.DataLoader.Builtin": "1.0.0"
+ },
+ "runtime": {
+ "Luban.DataTarget.Builtin.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ },
+ "Luban.DataValidator.Builtin/1.0.0": {
+ "dependencies": {
+ "Luban.Core": "1.0.0"
+ },
+ "runtime": {
+ "Luban.DataValidator.Builtin.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ },
+ "Luban.FlatBuffers/1.0.0": {
+ "dependencies": {
+ "Luban.Core": "1.0.0",
+ "Luban.DataTarget.Builtin": "1.0.0"
+ },
+ "runtime": {
+ "Luban.FlatBuffers.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ },
+ "Luban.Gdscript/1.0.0": {
+ "dependencies": {
+ "Luban.Core": "1.0.0",
+ "Luban.DataTarget.Builtin": "1.0.0"
+ },
+ "runtime": {
+ "Luban.Gdscript.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ },
+ "Luban.Golang/1.0.0": {
+ "dependencies": {
+ "Luban.Core": "1.0.0"
+ },
+ "runtime": {
+ "Luban.Golang.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ },
+ "Luban.Java/1.0.0": {
+ "dependencies": {
+ "Luban.Core": "1.0.0"
+ },
+ "runtime": {
+ "Luban.Java.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ },
+ "Luban.L10N/1.0.0": {
+ "dependencies": {
+ "Luban.Core": "1.0.0",
+ "Luban.DataLoader.Builtin": "1.0.0"
+ },
+ "runtime": {
+ "Luban.L10N.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ },
+ "Luban.Lua/1.0.0": {
+ "dependencies": {
+ "Luban.Core": "1.0.0"
+ },
+ "runtime": {
+ "Luban.Lua.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ },
+ "Luban.MsgPack/1.0.0": {
+ "dependencies": {
+ "Luban.Core": "1.0.0",
+ "MessagePack": "2.5.192"
+ },
+ "runtime": {
+ "Luban.MsgPack.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ },
+ "Luban.PHP/1.0.0": {
+ "dependencies": {
+ "Luban.Core": "1.0.0",
+ "Luban.DataTarget.Builtin": "1.0.0"
+ },
+ "runtime": {
+ "Luban.PHP.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ },
+ "Luban.Protobuf/1.0.0": {
+ "dependencies": {
+ "Google.Protobuf": "3.29.0",
+ "Luban.Core": "1.0.0",
+ "Luban.DataTarget.Builtin": "1.0.0"
+ },
+ "runtime": {
+ "Luban.Protobuf.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ },
+ "Luban.Python/1.0.0": {
+ "dependencies": {
+ "Luban.Core": "1.0.0",
+ "Luban.DataTarget.Builtin": "1.0.0"
+ },
+ "runtime": {
+ "Luban.Python.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ },
+ "Luban.Rust/1.0.0": {
+ "dependencies": {
+ "Luban.Core": "1.0.0"
+ },
+ "runtime": {
+ "Luban.Rust.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ },
+ "Luban.Schema.Builtin/1.0.0": {
+ "dependencies": {
+ "Luban.Core": "1.0.0",
+ "Luban.DataLoader.Builtin": "1.0.0"
+ },
+ "runtime": {
+ "Luban.Schema.Builtin.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ },
+ "Luban.Typescript/1.0.0": {
+ "dependencies": {
+ "Luban.CSharp": "1.0.0",
+ "Luban.Core": "1.0.0",
+ "Luban.DataTarget.Builtin": "1.0.0"
+ },
+ "runtime": {
+ "Luban.Typescript.dll": {
+ "assemblyVersion": "1.0.0.0",
+ "fileVersion": "1.0.0.0"
+ }
+ }
+ }
+ }
+ },
+ "libraries": {
+ "Luban/4.2.1": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "CommandLineParser/2.9.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-OE0sl1/sQ37bjVsPKKtwQlWDgqaxWgtme3xZz7JssWUzg5JpMIyHgCTY9MVMxOg48fJ1AgGT3tgdH5m/kQ5xhA==",
+ "path": "commandlineparser/2.9.1",
+ "hashPath": "commandlineparser.2.9.1.nupkg.sha512"
+ },
+ "ExcelDataReader/3.7.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-AMv3oDETRHSRyXC17rBtKH45qIfFyo433LMeaMB3u4RNr/c9Luuc0Z+JMP6+3Cx9n4wXqFqcrEIVxrf/GgYnZg==",
+ "path": "exceldatareader/3.7.0",
+ "hashPath": "exceldatareader.3.7.0.nupkg.sha512"
+ },
+ "Google.Protobuf/3.29.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-l1012jd1Y2XsLQ+h9cXE7Bo3WruXql3Xc3KP/z+yZDJMSkfb2guslHCxwFsqd2ScHB0h2J7Yuy255RrBD/DGBw==",
+ "path": "google.protobuf/3.29.0",
+ "hashPath": "google.protobuf.3.29.0.nupkg.sha512"
+ },
+ "MessagePack/2.5.192": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-Jtle5MaFeIFkdXtxQeL9Tu2Y3HsAQGoSntOzrn6Br/jrl6c8QmG22GEioT5HBtZJR0zw0s46OnKU8ei2M3QifA==",
+ "path": "messagepack/2.5.192",
+ "hashPath": "messagepack.2.5.192.nupkg.sha512"
+ },
+ "MessagePack.Annotations/2.5.192": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-jaJuwcgovWIZ8Zysdyf3b7b34/BrADw4v82GaEZymUhDd3ScMPrYd/cttekeDteJJPXseJxp04yTIcxiVUjTWg==",
+ "path": "messagepack.annotations/2.5.192",
+ "hashPath": "messagepack.annotations.2.5.192.nupkg.sha512"
+ },
+ "Microsoft.CSharp/4.5.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-kaj6Wb4qoMuH3HySFJhxwQfe8R/sJsNJnANrvv8WdFPMoNbKY5htfNscv+LHCu5ipz+49m2e+WQXpLXr9XYemQ==",
+ "path": "microsoft.csharp/4.5.0",
+ "hashPath": "microsoft.csharp.4.5.0.nupkg.sha512"
+ },
+ "Microsoft.NET.StringTools/17.6.3": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-N0ZIanl1QCgvUumEL1laasU0a7sOE5ZwLZVTn0pAePnfhq8P7SvTjF8Axq+CnavuQkmdQpGNXQ1efZtu5kDFbA==",
+ "path": "microsoft.net.stringtools/17.6.3",
+ "hashPath": "microsoft.net.stringtools.17.6.3.nupkg.sha512"
+ },
+ "Microsoft.NETCore.Platforms/1.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-2G6OjjJzwBfNOO8myRV/nFrbTw5iA+DEm0N+qUqhrOmaVtn4pC77h38I1jsXGw5VH55+dPfQsqHD0We9sCl9FQ==",
+ "path": "microsoft.netcore.platforms/1.0.1",
+ "hashPath": "microsoft.netcore.platforms.1.0.1.nupkg.sha512"
+ },
+ "Microsoft.NETCore.Targets/1.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-rkn+fKobF/cbWfnnfBOQHKVKIOpxMZBvlSHkqDWgBpwGDcLRduvs3D9OLGeV6GWGvVwNlVi2CBbTjuPmtHvyNw==",
+ "path": "microsoft.netcore.targets/1.0.1",
+ "hashPath": "microsoft.netcore.targets.1.0.1.nupkg.sha512"
+ },
+ "NeoLua/1.3.14": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-BXIUN+ePY2wx3ZGiSmR8KZKD85s01pXI690orrB3u/biB8R0nalziGw+iGbPBq1Cuz8Upggpw2ERF84POXWTCQ==",
+ "path": "neolua/1.3.14",
+ "hashPath": "neolua.1.3.14.nupkg.sha512"
+ },
+ "Newtonsoft.Json/13.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==",
+ "path": "newtonsoft.json/13.0.1",
+ "hashPath": "newtonsoft.json.13.0.1.nupkg.sha512"
+ },
+ "Newtonsoft.Json.Bson/1.0.3": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-bCcwagnHfYnhwQfY1criEcn6Hy9PtBuVnZu0pA8hmRhuR3jI/8WxVgoVAdNw9BJ3JHkxmWJzpj/AQy+PMMLqxg==",
+ "path": "newtonsoft.json.bson/1.0.3",
+ "hashPath": "newtonsoft.json.bson.1.0.3.nupkg.sha512"
+ },
+ "NLog/5.3.4": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-gLy7+O1hEYJXIlcTr1/VWjGXrZTQFZzYNO18IWasD64pNwz0BreV+nHLxWKXWZzERRzoKnsk2XYtwLkTVk7J1A==",
+ "path": "nlog/5.3.4",
+ "hashPath": "nlog.5.3.4.nupkg.sha512"
+ },
+ "Scriban/5.12.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-/YTTCxjBIpfwX3MKMT4JMFVl1jX4IHW7zih+Bg3cTIkzGnbFt+B3l/k90ILDw6DRiFE7T+VxEyls7zk4p029ng==",
+ "path": "scriban/5.12.0",
+ "hashPath": "scriban.5.12.0.nupkg.sha512"
+ },
+ "System.Collections/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-YUJGz6eFKqS0V//mLt25vFGrrCvOnsXjlvFQs+KimpwNxug9x0Pzy4PlFMU3Q2IzqAa9G2L4LsK3+9vCBK7oTg==",
+ "path": "system.collections/4.0.11",
+ "hashPath": "system.collections.4.0.11.nupkg.sha512"
+ },
+ "System.Diagnostics.Debug/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-w5U95fVKHY4G8ASs/K5iK3J5LY+/dLFd4vKejsnI/ZhBsWS9hQakfx3Zr7lRWKg4tAw9r4iktyvsTagWkqYCiw==",
+ "path": "system.diagnostics.debug/4.0.11",
+ "hashPath": "system.diagnostics.debug.4.0.11.nupkg.sha512"
+ },
+ "System.Diagnostics.Tools/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-xBfJ8pnd4C17dWaC9FM6aShzbJcRNMChUMD42I6772KGGrqaFdumwhn9OdM68erj1ueNo3xdQ1EwiFjK5k8p0g==",
+ "path": "system.diagnostics.tools/4.0.1",
+ "hashPath": "system.diagnostics.tools.4.0.1.nupkg.sha512"
+ },
+ "System.Globalization/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-B95h0YLEL2oSnwF/XjqSWKnwKOy/01VWkNlsCeMTFJLLabflpGV26nK164eRs5GiaRSBGpOxQ3pKoSnnyZN5pg==",
+ "path": "system.globalization/4.0.11",
+ "hashPath": "system.globalization.4.0.11.nupkg.sha512"
+ },
+ "System.IO/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-3KlTJceQc3gnGIaHZ7UBZO26SHL1SHE4ddrmiwumFnId+CEHP+O8r386tZKaE6zlk5/mF8vifMBzHj9SaXN+mQ==",
+ "path": "system.io/4.1.0",
+ "hashPath": "system.io.4.1.0.nupkg.sha512"
+ },
+ "System.Linq/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-bQ0iYFOQI0nuTnt+NQADns6ucV4DUvMdwN6CbkB1yj8i7arTGiTN5eok1kQwdnnNWSDZfIUySQY+J3d5KjWn0g==",
+ "path": "system.linq/4.1.0",
+ "hashPath": "system.linq.4.1.0.nupkg.sha512"
+ },
+ "System.Linq.Expressions/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-I+y02iqkgmCAyfbqOmSDOgqdZQ5tTj80Akm5BPSS8EeB0VGWdy6X1KCoYe8Pk6pwDoAKZUOdLVxnTJcExiv5zw==",
+ "path": "system.linq.expressions/4.1.0",
+ "hashPath": "system.linq.expressions.4.1.0.nupkg.sha512"
+ },
+ "System.ObjectModel/4.0.12": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-tAgJM1xt3ytyMoW4qn4wIqgJYm7L7TShRZG4+Q4Qsi2PCcj96pXN7nRywS9KkB3p/xDUjc2HSwP9SROyPYDYKQ==",
+ "path": "system.objectmodel/4.0.12",
+ "hashPath": "system.objectmodel.4.0.12.nupkg.sha512"
+ },
+ "System.Reflection/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-JCKANJ0TI7kzoQzuwB/OoJANy1Lg338B6+JVacPl4TpUwi3cReg3nMLplMq2uqYfHFQpKIlHAUVAJlImZz/4ng==",
+ "path": "system.reflection/4.1.0",
+ "hashPath": "system.reflection.4.1.0.nupkg.sha512"
+ },
+ "System.Reflection.Emit/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-P2wqAj72fFjpP6wb9nSfDqNBMab+2ovzSDzUZK7MVIm54tBJEPr9jWfSjjoTpPwj1LeKcmX3vr0ttyjSSFM47g==",
+ "path": "system.reflection.emit/4.0.1",
+ "hashPath": "system.reflection.emit.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.Emit.ILGeneration/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-Ov6dU8Bu15Bc7zuqttgHF12J5lwSWyTf1S+FJouUXVMSqImLZzYaQ+vRr1rQ0OZ0HqsrwWl4dsKHELckQkVpgA==",
+ "path": "system.reflection.emit.ilgeneration/4.0.1",
+ "hashPath": "system.reflection.emit.ilgeneration.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.Emit.Lightweight/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-sSzHHXueZ5Uh0OLpUQprhr+ZYJrLPA2Cmr4gn0wj9+FftNKXx8RIMKvO9qnjk2ebPYUjZ+F2ulGdPOsvj+MEjA==",
+ "path": "system.reflection.emit.lightweight/4.0.1",
+ "hashPath": "system.reflection.emit.lightweight.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.Extensions/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-GYrtRsZcMuHF3sbmRHfMYpvxZoIN2bQGrYGerUiWLEkqdEUQZhH3TRSaC/oI4wO0II1RKBPlpIa1TOMxIcOOzQ==",
+ "path": "system.reflection.extensions/4.0.1",
+ "hashPath": "system.reflection.extensions.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.Primitives/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-4inTox4wTBaDhB7V3mPvp9XlCbeGYWVEM9/fXALd52vNEAVisc1BoVWQPuUuD0Ga//dNbA/WeMy9u9mzLxGTHQ==",
+ "path": "system.reflection.primitives/4.0.1",
+ "hashPath": "system.reflection.primitives.4.0.1.nupkg.sha512"
+ },
+ "System.Reflection.TypeExtensions/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-tsQ/ptQ3H5FYfON8lL4MxRk/8kFyE0A+tGPXmVP967cT/gzLHYxIejIYSxp4JmIeFHVP78g/F2FE1mUUTbDtrg==",
+ "path": "system.reflection.typeextensions/4.1.0",
+ "hashPath": "system.reflection.typeextensions.4.1.0.nupkg.sha512"
+ },
+ "System.Resources.ResourceManager/4.0.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-TxwVeUNoTgUOdQ09gfTjvW411MF+w9MBYL7AtNVc+HtBCFlutPLhUCdZjNkjbhj3bNQWMdHboF0KIWEOjJssbA==",
+ "path": "system.resources.resourcemanager/4.0.1",
+ "hashPath": "system.resources.resourcemanager.4.0.1.nupkg.sha512"
+ },
+ "System.Runtime/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-v6c/4Yaa9uWsq+JMhnOFewrYkgdNHNG2eMKuNqRn8P733rNXeRCGvV5FkkjBXn2dbVkPXOsO0xjsEeM1q2zC0g==",
+ "path": "system.runtime/4.1.0",
+ "hashPath": "system.runtime.4.1.0.nupkg.sha512"
+ },
+ "System.Runtime.Extensions/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-CUOHjTT/vgP0qGW22U4/hDlOqXmcPq5YicBaXdUR2UiUoLwBT+olO6we4DVbq57jeX5uXH2uerVZhf0qGj+sVQ==",
+ "path": "system.runtime.extensions/4.1.0",
+ "hashPath": "system.runtime.extensions.4.1.0.nupkg.sha512"
+ },
+ "System.Runtime.Serialization.Primitives/4.1.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-HZ6Du5QrTG8MNJbf4e4qMO3JRAkIboGT5Fk804uZtg3Gq516S7hAqTm2UZKUHa7/6HUGdVy3AqMQKbns06G/cg==",
+ "path": "system.runtime.serialization.primitives/4.1.1",
+ "hashPath": "system.runtime.serialization.primitives.4.1.1.nupkg.sha512"
+ },
+ "System.Text.Encoding/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-U3gGeMlDZXxCEiY4DwVLSacg+DFWCvoiX+JThA/rvw37Sqrku7sEFeVBBBMBnfB6FeZHsyDx85HlKL19x0HtZA==",
+ "path": "system.text.encoding/4.0.11",
+ "hashPath": "system.text.encoding.4.0.11.nupkg.sha512"
+ },
+ "System.Text.Encoding.Extensions/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-jtbiTDtvfLYgXn8PTfWI+SiBs51rrmO4AAckx4KR6vFK9Wzf6tI8kcRdsYQNwriUeQ1+CtQbM1W4cMbLXnj/OQ==",
+ "path": "system.text.encoding.extensions/4.0.11",
+ "hashPath": "system.text.encoding.extensions.4.0.11.nupkg.sha512"
+ },
+ "System.Text.RegularExpressions/4.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-i88YCXpRTjCnoSQZtdlHkAOx4KNNik4hMy83n0+Ftlb7jvV6ZiZWMpnEZHhjBp6hQVh8gWd/iKNPzlPF7iyA2g==",
+ "path": "system.text.regularexpressions/4.1.0",
+ "hashPath": "system.text.regularexpressions.4.1.0.nupkg.sha512"
+ },
+ "System.Threading/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-N+3xqIcg3VDKyjwwCGaZ9HawG9aC6cSDI+s7ROma310GQo8vilFZa86hqKppwTHleR/G0sfOzhvgnUxWCR/DrQ==",
+ "path": "system.threading/4.0.11",
+ "hashPath": "system.threading.4.0.11.nupkg.sha512"
+ },
+ "System.Threading.Tasks/4.0.11": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-k1S4Gc6IGwtHGT8188RSeGaX86Qw/wnrgNLshJvsdNUOPP9etMmo8S07c+UlOAx4K/xLuN9ivA1bD0LVurtIxQ==",
+ "path": "system.threading.tasks/4.0.11",
+ "hashPath": "system.threading.tasks.4.0.11.nupkg.sha512"
+ },
+ "Ude.NetStandard/1.2.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-zRWpPAxBg3lNdm4UiKixTe+DFPoNid9CILggTCy/0WR2WKETe17kTWhiiIpLB2k5IEgnvA0QLfKlvd6Tvu0pzA==",
+ "path": "ude.netstandard/1.2.0",
+ "hashPath": "ude.netstandard.1.2.0.nupkg.sha512"
+ },
+ "YamlDotNet.NetCore/1.0.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-vPiKF4Yf02MS96Nzwcr8+WrvlhTx+camOgUzxhazU0hCzs2ESetWDCxaIT/MYdAw2oONYem1ow9PXWJjHkRUDw==",
+ "path": "yamldotnet.netcore/1.0.0",
+ "hashPath": "yamldotnet.netcore.1.0.0.nupkg.sha512"
+ },
+ "Luban.Bson/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "Luban.Core/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "Luban.Cpp/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "Luban.CSharp/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "Luban.Dart/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "Luban.DataLoader.Builtin/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "Luban.DataTarget.Builtin/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "Luban.DataValidator.Builtin/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "Luban.FlatBuffers/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "Luban.Gdscript/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "Luban.Golang/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "Luban.Java/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "Luban.L10N/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "Luban.Lua/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "Luban.MsgPack/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "Luban.PHP/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "Luban.Protobuf/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "Luban.Python/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "Luban.Rust/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "Luban.Schema.Builtin/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "Luban.Typescript/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ }
+ }
+}
\ No newline at end of file
diff --git a/Config/Tools/Luban/Luban.dll b/Config/Tools/Luban/Luban.dll
new file mode 100644
index 0000000..1d58b97
Binary files /dev/null and b/Config/Tools/Luban/Luban.dll differ
diff --git a/Config/Tools/Luban/Luban.exe b/Config/Tools/Luban/Luban.exe
new file mode 100644
index 0000000..b3e8322
Binary files /dev/null and b/Config/Tools/Luban/Luban.exe differ
diff --git a/Config/Tools/Luban/Luban.runtimeconfig.json b/Config/Tools/Luban/Luban.runtimeconfig.json
new file mode 100644
index 0000000..d784515
--- /dev/null
+++ b/Config/Tools/Luban/Luban.runtimeconfig.json
@@ -0,0 +1,13 @@
+{
+ "runtimeOptions": {
+ "tfm": "net8.0",
+ "framework": {
+ "name": "Microsoft.NETCore.App",
+ "version": "8.0.0"
+ },
+ "configProperties": {
+ "System.Reflection.Metadata.MetadataUpdater.IsSupported": false,
+ "System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false
+ }
+ }
+}
\ No newline at end of file
diff --git a/Config/Tools/Luban/MessagePack.Annotations.dll b/Config/Tools/Luban/MessagePack.Annotations.dll
new file mode 100644
index 0000000..b3a3f48
Binary files /dev/null and b/Config/Tools/Luban/MessagePack.Annotations.dll differ
diff --git a/Config/Tools/Luban/MessagePack.dll b/Config/Tools/Luban/MessagePack.dll
new file mode 100644
index 0000000..ed883d0
Binary files /dev/null and b/Config/Tools/Luban/MessagePack.dll differ
diff --git a/Config/Tools/Luban/Microsoft.NET.StringTools.dll b/Config/Tools/Luban/Microsoft.NET.StringTools.dll
new file mode 100644
index 0000000..7d30439
Binary files /dev/null and b/Config/Tools/Luban/Microsoft.NET.StringTools.dll differ
diff --git a/Config/Tools/Luban/NLog.dll b/Config/Tools/Luban/NLog.dll
new file mode 100644
index 0000000..49604e1
Binary files /dev/null and b/Config/Tools/Luban/NLog.dll differ
diff --git a/Config/Tools/Luban/Neo.Lua.dll b/Config/Tools/Luban/Neo.Lua.dll
new file mode 100644
index 0000000..406f580
Binary files /dev/null and b/Config/Tools/Luban/Neo.Lua.dll differ
diff --git a/Config/Tools/Luban/Newtonsoft.Json.Bson.dll b/Config/Tools/Luban/Newtonsoft.Json.Bson.dll
new file mode 100644
index 0000000..159d2ed
Binary files /dev/null and b/Config/Tools/Luban/Newtonsoft.Json.Bson.dll differ
diff --git a/Config/Tools/Luban/Newtonsoft.Json.dll b/Config/Tools/Luban/Newtonsoft.Json.dll
new file mode 100644
index 0000000..1ffeabe
Binary files /dev/null and b/Config/Tools/Luban/Newtonsoft.Json.dll differ
diff --git a/Config/Tools/Luban/Scriban.dll b/Config/Tools/Luban/Scriban.dll
new file mode 100644
index 0000000..c8131e2
Binary files /dev/null and b/Config/Tools/Luban/Scriban.dll differ
diff --git a/Config/Tools/Luban/Templates/common/cpp/enum.sbn b/Config/Tools/Luban/Templates/common/cpp/enum.sbn
new file mode 100644
index 0000000..b9f3b0a
--- /dev/null
+++ b/Config/Tools/Luban/Templates/common/cpp/enum.sbn
@@ -0,0 +1,23 @@
+{{~
+ comment = __enum.comment
+ items = __enum.items
+~}}
+{{namespace_with_grace_begin __namespace}}
+{{~if comment != '' ~}}
+ ///
+ /// {{escape_comment comment}}
+ ///
+{{~end~}}
+ enum class {{__name}}
+ {
+ {{~ for item in items ~}}
+{{~if item.comment != '' ~}}
+ ///
+ /// {{escape_comment item.comment_or_alias}}
+ ///
+{{~end~}}
+ {{format_enum_item_name __code_style item.name}} = {{item.value}},
+ {{~end~}}
+ };
+
+{{namespace_with_grace_end __namespace}}
diff --git a/Config/Tools/Luban/Templates/common/cs/enum.sbn b/Config/Tools/Luban/Templates/common/cs/enum.sbn
new file mode 100644
index 0000000..4dcd9b6
--- /dev/null
+++ b/Config/Tools/Luban/Templates/common/cs/enum.sbn
@@ -0,0 +1,28 @@
+{{~
+ comment = __enum.comment
+ items = __enum.items
+~}}
+
+
+{{namespace_with_grace_begin __namespace_with_top_module}}
+{{~if comment != '' ~}}
+ ///
+ /// {{escape_comment comment}}
+ ///
+{{~end~}}
+ {{~if __enum.is_flags~}}
+ [System.Flags]
+ {{~end~}}
+ public enum {{__name}}
+ {
+ {{~ for item in items ~}}
+{{~if item.comment != '' ~}}
+ ///
+ /// {{escape_comment item.comment_or_alias}}
+ ///
+{{~end~}}
+ {{format_enum_item_name __code_style item.name}} = {{item.value}},
+ {{~end~}}
+ }
+
+{{namespace_with_grace_end __namespace_with_top_module}}
diff --git a/Config/Tools/Luban/Templates/common/dart/enum.sbn b/Config/Tools/Luban/Templates/common/dart/enum.sbn
new file mode 100644
index 0000000..97417f0
--- /dev/null
+++ b/Config/Tools/Luban/Templates/common/dart/enum.sbn
@@ -0,0 +1,30 @@
+{{~if __this.comment != '' ~}}
+//{{escape_comment __this.comment}}
+{{~end~}}
+enum {{__name}}
+{
+ {{~if !has_enum_item __this~}}
+ empty_placeholder(0);
+ {{~else~}}
+{{~if !__this.has_zero_value_item ~}}
+ None(0),
+{{~end~}}
+ {{~end~}}
+
+
+ {{~ for item in __this.items ~}}
+{{~if item.comment_or_alias != '' ~}}
+ //{{escape_comment item.comment_or_alias}}
+{{~end~}}
+ {{item.name}}({{item.int_value}}) {{is_last_enum_item __this item.int_value ? ';' : ','}}
+
+ {{~end~}}
+ final int value;
+
+ const {{__name}}(this.value);
+
+ static {{__name}} fromValue(int value)
+ {
+ return {{__name}}.values.firstWhere((element) => element.value == value, orElse: () => fromValue(0));
+ }
+}
diff --git a/Config/Tools/Luban/Templates/common/go/enum.sbn b/Config/Tools/Luban/Templates/common/go/enum.sbn
new file mode 100644
index 0000000..7dd70a6
--- /dev/null
+++ b/Config/Tools/Luban/Templates/common/go/enum.sbn
@@ -0,0 +1,19 @@
+{{~if ___top_module != ''~}}
+package {{__top_module}};
+{{~end~}}
+
+{{~if __this.comment != '' ~}}
+/**
+ * {{escape_comment __this.comment}}
+ */
+{{~end~}}
+const (
+ {{~ for item in __this.items ~}}
+{{~if item.comment_or_alias != '' ~}}
+ /**
+ * {{escape_comment item.comment_or_alias}}
+ */
+{{~end~}}
+ {{full_name __this}}_{{item.name}} = {{item.int_value}};
+ {{~end~}}
+)
diff --git a/Config/Tools/Luban/Templates/common/java/enum.sbn b/Config/Tools/Luban/Templates/common/java/enum.sbn
new file mode 100644
index 0000000..142d8a1
--- /dev/null
+++ b/Config/Tools/Luban/Templates/common/java/enum.sbn
@@ -0,0 +1,19 @@
+{{~if __namespace_with_top_module != ''~}}
+package {{__namespace_with_top_module}};
+{{~end~}}
+
+{{~if __this.comment != '' ~}}
+/**
+ * {{escape_comment __this.comment}}
+ */
+{{~end~}}
+public final class {{__name}} {
+ {{~ for item in __this.items ~}}
+{{~if item.comment_or_alias != '' ~}}
+ /**
+ * {{escape_comment item.comment_or_alias}}
+ */
+{{~end~}}
+ public static final int {{item.name}} = {{item.int_value}};
+ {{~end~}}
+}
diff --git a/Config/Tools/Luban/Templates/common/php/enum.sbn b/Config/Tools/Luban/Templates/common/php/enum.sbn
new file mode 100644
index 0000000..139597f
--- /dev/null
+++ b/Config/Tools/Luban/Templates/common/php/enum.sbn
@@ -0,0 +1,2 @@
+
+
diff --git a/Config/Tools/Luban/Templates/common/rs/macros/Cargo.toml.sbn b/Config/Tools/Luban/Templates/common/rs/macros/Cargo.toml.sbn
new file mode 100644
index 0000000..ae3a110
--- /dev/null
+++ b/Config/Tools/Luban/Templates/common/rs/macros/Cargo.toml.sbn
@@ -0,0 +1,14 @@
+[package]
+name = "macros"
+version = "0.1.0"
+edition = "2021"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
+quote = "1.0.36"
+syn = "2.0.60"
+proc-macro2 = "1.0.82"
+
+[lib]
+proc-macro = true
\ No newline at end of file
diff --git a/Config/Tools/Luban/Templates/common/rs/macros/src/lib.rs.sbn b/Config/Tools/Luban/Templates/common/rs/macros/src/lib.rs.sbn
new file mode 100644
index 0000000..7e93f74
--- /dev/null
+++ b/Config/Tools/Luban/Templates/common/rs/macros/src/lib.rs.sbn
@@ -0,0 +1,65 @@
+#[macro_use]
+extern crate quote;
+
+use proc_macro::TokenStream;
+use proc_macro2;
+use quote::{format_ident, quote, ToTokens};
+use syn::{parse_macro_input, Data, DeriveInput};
+
+#[proc_macro_derive(TryIntoBase)]
+pub fn base_try_from(item: TokenStream) -> TokenStream {
+ let derive_input = parse_macro_input!(item as DeriveInput);
+ let ty_name = &derive_input.ident;
+
+ match derive_input.data {
+ Data::Struct(_) => {}
+ _ => panic!("base_try_from can only be used on structs or enums"),
+ }
+
+ let expanded = quote! {
+ impl<'a> TryFrom<&'a AbstractBase> for &'a #ty_name {
+ type Error = String;
+
+ fn try_from(value: &'a AbstractBase) -> Result {
+ let r = value.downcast_ref::<#ty_name>();
+ if let Some(v) = r {
+ return Ok(v);
+ }
+
+ Err(concat!("can not into to ", stringify!(#ty_name)).to_string())
+ }
+ }
+ };
+
+ TokenStream::from(expanded)
+}
+
+#[proc_macro_derive(EnumFromNum)]
+pub fn enum_from_num(input: TokenStream) -> TokenStream {
+ let input = parse_macro_input!(input as DeriveInput);
+ let ty_name = &input.ident;
+
+
+ let tokens = vec![
+ format_ident!("i64"),
+ format_ident!("i16"),
+ format_ident!("i8"),
+ format_ident!("isize"),
+ format_ident!("u64"),
+ format_ident!("u32"),
+ format_ident!("u16"),
+ format_ident!("u8"),
+ format_ident!("usize"),
+ format_ident!("f64"),
+ format_ident!("f32"),
+ ];
+ quote! {
+ #(
+ impl From<#tokens> for #ty_name {
+ fn from(value: #tokens) -> Self {
+ (value as i32).into()
+ }
+ }
+ )*
+ }.into()
+}
\ No newline at end of file
diff --git a/Config/Tools/Luban/Templates/common/ts/enum.sbn b/Config/Tools/Luban/Templates/common/ts/enum.sbn
new file mode 100644
index 0000000..139597f
--- /dev/null
+++ b/Config/Tools/Luban/Templates/common/ts/enum.sbn
@@ -0,0 +1,2 @@
+
+
diff --git a/Config/Tools/Luban/Templates/cpp-rawptr-bin/bean.sbn b/Config/Tools/Luban/Templates/cpp-rawptr-bin/bean.sbn
new file mode 100644
index 0000000..2b856b0
--- /dev/null
+++ b/Config/Tools/Luban/Templates/cpp-rawptr-bin/bean.sbn
@@ -0,0 +1,32 @@
+{{namespace_with_grace_begin __namespace}}
+
+{{~if __this.comment != '' ~}}
+/**
+ * {{escape_comment __this.comment}}
+ */
+{{~end~}}
+struct {{__name}} : public{{if __parent_def_type}} {{make_cpp_name __parent_def_type.full_name}} {{else}} luban::CfgBean {{end}}
+{
+ static bool deserialize{{__name}}(::luban::ByteBuf& _buf, {{__name}}*& _out);
+
+ virtual ~{{__name}}() {}
+
+ bool deserialize(::luban::ByteBuf& _buf);
+
+ {{~ for field in __export_fields ~}}
+{{~if field.comment != '' ~}}
+ /**
+ * {{escape_comment field.comment}}
+ */
+{{~end~}}
+ {{declaring_type_name field.ctype}} {{format_field_name __code_style field.name}};
+ {{~end~}}
+
+{{~if !__this.is_abstract_type~}}
+ static constexpr int __ID__ = {{__this.id}};
+
+ int getTypeId() const override { return __ID__; }
+{{~end~}}
+};
+
+{{namespace_with_grace_end __namespace}}
diff --git a/Config/Tools/Luban/Templates/cpp-rawptr-bin/schema_cpp.sbn b/Config/Tools/Luban/Templates/cpp-rawptr-bin/schema_cpp.sbn
new file mode 100644
index 0000000..18c1531
--- /dev/null
+++ b/Config/Tools/Luban/Templates/cpp-rawptr-bin/schema_cpp.sbn
@@ -0,0 +1,45 @@
+#include "{{__schema_header_file}}"
+
+{{namespace_with_grace_begin __top_module}}
+
+{{~for bean in __beans~}}
+
+bool {{make_cpp_name bean.full_name}}::deserialize(::luban::ByteBuf& _buf)
+{
+ {{~if bean.parent_def_type~}}
+ if (!{{make_cpp_name bean.parent_def_type.full_name}}::deserialize(_buf))
+ {
+ return false;
+ }
+ {{~end~}}
+
+ {{~ for field in bean.export_fields ~}}
+ {{deserialize '_buf' (format_field_name __code_style field.name) field.ctype}}
+ {{~end~}}
+
+ return true;
+}
+
+{{~if bean.is_abstract_type~}}
+bool {{make_cpp_name bean.full_name}}::deserialize{{bean.name}}(::luban::ByteBuf& _buf, {{make_cpp_name bean.full_name}}*& _out)
+{
+ int32_t id;
+ if (!_buf.readInt(id)) return false;
+ switch (id)
+ {
+ {{~for child in bean.hierarchy_not_abstract_children~}}
+ case {{make_type_cpp_name child}}::__ID__: { _out = LUBAN_NEW({{make_type_cpp_name child}}); if (_out->deserialize(_buf)) { return true; } else { _out = nullptr; return false;} }
+ {{~end~}}
+ default: { _out = nullptr; return false;}
+ }
+}
+{{~else~}}
+bool {{make_cpp_name bean.full_name}}::deserialize{{bean.name}}(::luban::ByteBuf& _buf, {{make_cpp_name bean.full_name}}*& _out)
+{
+ _out = LUBAN_NEW({{make_type_cpp_name bean}});
+ return _out->deserialize(_buf);
+}
+{{~end~}}
+
+{{~end~}}
+{{namespace_with_grace_end __top_module}}
diff --git a/Config/Tools/Luban/Templates/cpp-rawptr-bin/schema_h.sbn b/Config/Tools/Luban/Templates/cpp-rawptr-bin/schema_h.sbn
new file mode 100644
index 0000000..90ba84c
--- /dev/null
+++ b/Config/Tools/Luban/Templates/cpp-rawptr-bin/schema_h.sbn
@@ -0,0 +1,21 @@
+#pragma once
+#include
+#include
+
+#include "CfgBean.h"
+
+{{namespace_with_grace_begin __top_module}}
+
+{{__enum_codes~}}
+
+{{~for b in __beans~}}
+{{namespace_with_grace_begin b.namespace}} struct {{b.name}}; {{namespace_with_grace_end b.namespace}}
+{{~end~}}
+
+{{~__bean_codes~}}
+
+{{~__table_codes~}}
+
+{{__tables_code}}
+
+{{namespace_with_grace_end __top_module}}
diff --git a/Config/Tools/Luban/Templates/cpp-rawptr-bin/table.sbn b/Config/Tools/Luban/Templates/cpp-rawptr-bin/table.sbn
new file mode 100644
index 0000000..511a546
--- /dev/null
+++ b/Config/Tools/Luban/Templates/cpp-rawptr-bin/table.sbn
@@ -0,0 +1,134 @@
+{{namespace_with_grace_begin __namespace}}
+
+{{~if __this.comment != '' ~}}
+/**
+ * {{escape_comment __this.comment}}
+ */
+{{~end~}}
+
+class {{__name}}
+{
+ {{~if __this.is_map_table ~}}
+ private:
+ ::luban::HashMap<{{declaring_type_name __key_type}}, {{declaring_type_name __value_type}}> _dataMap;
+ ::luban::Vector<{{declaring_type_name __value_type}}> _dataList;
+
+ public:
+ ~{{__name}}()
+ {
+ for (auto& _v : _dataList)
+ {
+ LUBAN_FREE(_v);
+ }
+ }
+
+ bool load(::luban::ByteBuf& _buf)
+ {
+ int n;
+ if (!_buf.readSize(n)) return false;
+ for(; n > 0 ; --n)
+ {
+ {{declaring_type_name __value_type}} _v;
+ {{deserialize '_buf' '_v' __value_type}}
+ _dataList.push_back(_v);
+ _dataMap[_v->{{format_field_name __code_style __this.index_field.name}}] = _v;
+ }
+ return true;
+ }
+
+ const ::luban::HashMap<{{declaring_type_name __key_type}}, {{declaring_type_name __value_type}}>& getDataMap() const { return _dataMap; }
+ const ::luban::Vector<{{declaring_type_name __value_type}}>& getDataList() const { return _dataList; }
+
+ {{declaring_type_name __value_type}} get({{declaring_type_name __key_type}} key)
+ {
+ auto it = _dataMap.find(key);
+ return it != _dataMap.end() ? it->second : nullptr;
+ }
+
+ {{~else if __this.is_list_table~}}
+ private:
+ ::luban::Vector<{{declaring_type_name __value_type}}> _dataList;
+ {{~if __this.is_union_index~}}
+
+ {{~else if !__this.index_list.empty?~}}
+ {{~for idx in __this.index_list~}}
+ ::luban::HashMap<{{declaring_type_name idx.type}}, {{declaring_type_name __value_type}}> _dataMap_{{idx.index_field.name}};
+ {{~end~}}
+ {{~else~}}
+ {{~end~}}
+
+ public:
+ bool load(::luban::ByteBuf& _buf)
+ {
+ int n;
+ if (!_buf.readSize(n)) return false;
+ for(; n > 0 ; --n)
+ {
+ {{declaring_type_name __value_type}} _v;
+ {{deserialize '_buf' '_v' __value_type}}
+ _dataList.push_back(_v);
+ {{~if __this.is_union_index~}}
+
+ {{~else if !__this.index_list.empty?~}}
+ {{~for idx in __this.index_list~}}
+ _dataMap_{{idx.index_field.name}}[_v->{{idx.index_field.name}}] = _v;
+ {{~end~}}
+ {{~else~}}
+ {{~end~}}
+ }
+ return true;
+ }
+
+ const ::luban::Vector<{{declaring_type_name __value_type}}>& getDataList() const { return _dataList; }
+
+ {{~if __this.is_union_index~}}
+
+ {{~else if !__this.index_list.empty?~}}
+ {{~for idx in __this.index_list~}}
+ ::luban::HashMap<{{declaring_type_name idx.type}}, {{declaring_type_name __value_type}}>& getDataMapBy{{idx.index_field.name}}()
+ {
+ return _dataMap_{{idx.index_field.name}};
+ }
+
+ {{declaring_type_name __value_type}} getBy{{idx.index_field.name}}({{declaring_type_name idx.type}} key)
+ {
+ auto it = _dataMap_{{idx.index_field.name}}.find(key);
+ return it != _dataMap_{{idx.index_field.name}}.end() ? it->second : nullptr;
+ }
+ {{~end~}}
+ {{~else~}}
+
+ {{declaring_type_name __value_type}} get(size_t index) const
+ {
+ return _dataList[index];
+ }
+ {{~end~}}
+ {{~else~}}
+ private:
+ {{declaring_type_name __value_type}} _data;
+
+ public:
+ {{declaring_type_name __value_type}} data() const { return _data; }
+
+ bool load(::luban::ByteBuf& _buf)
+ {
+ int n;
+ if (!_buf.readSize(n)) return false;
+ if (n != 1) return false;
+ {{deserialize '_buf' '_data' __value_type}}
+ return true;
+ }
+
+
+ {{~ for field in __value_type.def_bean.hierarchy_export_fields ~}}
+{{~if field.comment != '' ~}}
+ /**
+ * {{escape_comment field.comment}}
+ */
+{{~end~}}
+ {{declaring_type_name field.ctype}}& {{getter_name field.name}}() const { return _data->{{format_field_name __code_style field.name}}; }
+ {{~end~}}
+ {{~end~}}
+};
+
+{{namespace_with_grace_end __namespace}}
diff --git a/Config/Tools/Luban/Templates/cpp-rawptr-bin/tables.sbn b/Config/Tools/Luban/Templates/cpp-rawptr-bin/tables.sbn
new file mode 100644
index 0000000..76354d5
--- /dev/null
+++ b/Config/Tools/Luban/Templates/cpp-rawptr-bin/tables.sbn
@@ -0,0 +1,23 @@
+class {{__name}}
+{
+ public:
+ {{~for table in __tables ~}}
+{{~if table.comment != '' ~}}
+ /**
+ * {{escape_comment table.comment}}
+ */
+{{~end~}}
+ {{make_cpp_name table.full_name}} {{table.name}};
+ {{~end~}}
+
+ bool load(::luban::Loader<::luban::ByteBuf> loader)
+ {
+ ::luban::ByteBuf buf;
+ {{~for table in __tables~}}
+ buf.clear();
+ if (!loader(buf, "{{table.output_data_file}}")) return false;
+ if (!{{table.name}}.load(buf)) return false;
+ {{~end~}}
+ return true;
+ }
+};
diff --git a/Config/Tools/Luban/Templates/cpp-sharedptr-bin/bean.sbn b/Config/Tools/Luban/Templates/cpp-sharedptr-bin/bean.sbn
new file mode 100644
index 0000000..f55cd31
--- /dev/null
+++ b/Config/Tools/Luban/Templates/cpp-sharedptr-bin/bean.sbn
@@ -0,0 +1,32 @@
+{{namespace_with_grace_begin __namespace}}
+
+{{~if __this.comment != '' ~}}
+/**
+ * {{escape_comment __this.comment}}
+ */
+{{~end~}}
+struct {{__name}} : public{{if __parent_def_type}} {{make_cpp_name __parent_def_type.full_name}} {{else}} luban::CfgBean {{end}}
+{
+ static bool deserialize{{__name}}(::luban::ByteBuf& _buf, ::luban::SharedPtr<{{__name}}>& _out);
+
+ virtual ~{{__name}}() {}
+
+ bool deserialize(::luban::ByteBuf& _buf);
+
+ {{~ for field in __export_fields ~}}
+{{~if field.comment != '' ~}}
+ /**
+ * {{escape_comment field.comment}}
+ */
+{{~end~}}
+ {{declaring_type_name field.ctype}} {{format_field_name __code_style field.name}};
+ {{~end~}}
+
+{{~if !__this.is_abstract_type~}}
+ static constexpr int __ID__ = {{__this.id}};
+
+ int getTypeId() const override { return __ID__; }
+{{~end~}}
+};
+
+{{namespace_with_grace_end __namespace}}
\ No newline at end of file
diff --git a/Config/Tools/Luban/Templates/cpp-sharedptr-bin/schema_cpp.sbn b/Config/Tools/Luban/Templates/cpp-sharedptr-bin/schema_cpp.sbn
new file mode 100644
index 0000000..1d1a92c
--- /dev/null
+++ b/Config/Tools/Luban/Templates/cpp-sharedptr-bin/schema_cpp.sbn
@@ -0,0 +1,50 @@
+#include "{{__schema_header_file}}"
+
+{{namespace_with_grace_begin __top_module}}
+
+{{~for bean in __beans~}}
+
+bool {{make_cpp_name bean.full_name}}::deserialize(::luban::ByteBuf& _buf)
+{
+ {{~if bean.parent_def_type~}}
+ if (!{{make_cpp_name bean.parent_def_type.full_name}}::deserialize(_buf))
+ {
+ return false;
+ }
+ {{~end~}}
+
+ {{~ for field in bean.export_fields ~}}
+ {{deserialize '_buf' (format_field_name __code_style field.name) field.ctype}}
+ {{~end~}}
+
+ return true;
+}
+
+bool {{make_cpp_name bean.full_name}}::deserialize{{bean.name}}(::luban::ByteBuf& _buf, ::luban::SharedPtr<{{make_cpp_name bean.full_name}}>& _out)
+{
+{{~if bean.is_abstract_type~}}
+ int32_t id;
+ if (!_buf.readInt(id)) return false;
+ switch (id)
+ {
+ {{~for child in bean.hierarchy_not_abstract_children~}}
+ case {{make_type_cpp_name child}}::__ID__: { _out.reset(LUBAN_NEW({{make_type_cpp_name child}})); if (_out->deserialize(_buf)) { return true; } else { _out.reset(); return false;} }
+ {{~end~}}
+ default: { _out = nullptr; return false;}
+ }
+{{~else~}}
+ _out.reset(LUBAN_NEW({{make_type_cpp_name bean}}));
+ if (_out->deserialize(_buf))
+ {
+ return true;
+ }
+ else
+ {
+ _out.reset();
+ return false;
+ }
+{{~end~}}
+}
+
+{{~end~}}
+{{namespace_with_grace_end __top_module}}
diff --git a/Config/Tools/Luban/Templates/cpp-sharedptr-bin/schema_h.sbn b/Config/Tools/Luban/Templates/cpp-sharedptr-bin/schema_h.sbn
new file mode 100644
index 0000000..90ba84c
--- /dev/null
+++ b/Config/Tools/Luban/Templates/cpp-sharedptr-bin/schema_h.sbn
@@ -0,0 +1,21 @@
+#pragma once
+#include
+#include
+
+#include "CfgBean.h"
+
+{{namespace_with_grace_begin __top_module}}
+
+{{__enum_codes~}}
+
+{{~for b in __beans~}}
+{{namespace_with_grace_begin b.namespace}} struct {{b.name}}; {{namespace_with_grace_end b.namespace}}
+{{~end~}}
+
+{{~__bean_codes~}}
+
+{{~__table_codes~}}
+
+{{__tables_code}}
+
+{{namespace_with_grace_end __top_module}}
diff --git a/Config/Tools/Luban/Templates/cpp-sharedptr-bin/table.sbn b/Config/Tools/Luban/Templates/cpp-sharedptr-bin/table.sbn
new file mode 100644
index 0000000..f883847
--- /dev/null
+++ b/Config/Tools/Luban/Templates/cpp-sharedptr-bin/table.sbn
@@ -0,0 +1,140 @@
+{{namespace_with_grace_begin __namespace}}
+
+{{~if __this.comment != '' ~}}
+/**
+ * {{escape_comment __this.comment}}
+ */
+{{~end~}}
+
+class {{__name}}
+{
+ {{~if __this.is_map_table ~}}
+ private:
+ ::luban::HashMap<{{declaring_type_name __key_type}}, {{declaring_type_name __value_type}}> _dataMap;
+ ::luban::Vector<{{declaring_type_name __value_type}}> _dataList;
+
+ public:
+ bool load(::luban::ByteBuf& _buf)
+ {
+ int n;
+ if (!_buf.readSize(n)) return false;
+ for(; n > 0 ; --n)
+ {
+ {{declaring_type_name __value_type}} _v;
+ {{deserialize '_buf' '_v' __value_type}}
+ _dataList.push_back(_v);
+ _dataMap[_v->{{format_field_name __code_style __this.index_field.name}}] = _v;
+ }
+ return true;
+ }
+
+ const ::luban::HashMap<{{declaring_type_name __key_type}}, {{declaring_type_name __value_type}}>& getDataMap() const { return _dataMap; }
+ const ::luban::Vector<{{declaring_type_name __value_type}}>& getDataList() const { return _dataList; }
+
+ {{make_type_cpp_name __value_type.def_bean}}* getRaw({{declaring_type_name __key_type}} key)
+ {
+ auto it = _dataMap.find(key);
+ return it != _dataMap.end() ? it->second.get() : nullptr;
+ }
+
+ {{declaring_type_name __value_type}} get({{declaring_type_name __key_type}} key)
+ {
+ auto it = _dataMap.find(key);
+ return it != _dataMap.end() ? it->second : nullptr;
+ }
+
+ {{~else if __this.is_list_table~}}
+ private:
+ ::luban::Vector<{{declaring_type_name __value_type}}> _dataList;
+ {{~if __this.is_union_index~}}
+
+ {{~else if !__this.index_list.empty?~}}
+ {{~for idx in __this.index_list~}}
+ ::luban::HashMap<{{declaring_type_name idx.type}}, {{declaring_type_name __value_type}}> _dataMap_{{idx.index_field.name}};
+ {{~end~}}
+ {{~else~}}
+ {{~end~}}
+
+ public:
+ bool load(::luban::ByteBuf& _buf)
+ {
+ int n;
+ if (!_buf.readSize(n)) return false;
+ for(; n > 0 ; --n)
+ {
+ {{declaring_type_name __value_type}} _v;
+ {{deserialize '_buf' '_v' __value_type}}
+ _dataList.push_back(_v);
+ {{~if __this.is_union_index~}}
+
+ {{~else if !__this.index_list.empty?~}}
+ {{~for idx in __this.index_list~}}
+ _dataMap_{{idx.index_field.name}}[_v->{{idx.index_field.name}}] = _v;
+ {{~end~}}
+ {{~else~}}
+ {{~end~}}
+ }
+ return true;
+ }
+
+ const ::luban::Vector<{{declaring_type_name __value_type}}>& getDataList() const { return _dataList; }
+
+ {{~if __this.is_union_index~}}
+
+ {{~else if !__this.index_list.empty?~}}
+ {{~for idx in __this.index_list~}}
+ ::luban::HashMap<{{declaring_type_name idx.type}}, {{declaring_type_name __value_type}}>& getDataMapBy{{idx.index_field.name}}()
+ {
+ return _dataMap_{{idx.index_field.name}};
+ }
+ {{make_type_cpp_name __value_type.def_bean}}* getRawBy{{idx.index_field.name}}({{declaring_type_name idx.type}} key)
+ {
+ auto it = _dataMap_{{idx.index_field.name}}.find(key);
+ return it != _dataMap_{{idx.index_field.name}}.end() ? it->second.get() : nullptr;
+ }
+ {{declaring_type_name __value_type}} getBy{{idx.index_field.name}}({{declaring_type_name idx.type}} key)
+ {
+ auto it = _dataMap_{{idx.index_field.name}}.find(key);
+ return it != _dataMap_{{idx.index_field.name}}.end() ? it->second : nullptr;
+ }
+ {{~end~}}
+ {{~else~}}
+ {{make_type_cpp_name __value_type.def_bean}}* getRaw(size_t index) const
+ {
+ return _dataList[index].get();
+ }
+
+ {{declaring_type_name __value_type}} get(size_t index) const
+ {
+ return _dataList[index];
+ }
+ {{~end~}}
+ {{~else~}}
+ private:
+ {{declaring_type_name __value_type}} _data;
+
+ public:
+ {{declaring_type_name __value_type}} data() const { return _data; }
+
+ bool load(::luban::ByteBuf& _buf)
+ {
+ int n;
+ if (!_buf.readSize(n)) return false;
+ if (n != 1) return false;
+ {{deserialize '_buf' '_data' __value_type}}
+ return true;
+ }
+
+
+ {{~ for field in __value_type.def_bean.hierarchy_export_fields ~}}
+{{~if field.comment != '' ~}}
+ /**
+ * {{escape_comment field.comment}}
+ */
+{{~end~}}
+ {{declaring_type_name field.ctype}}& {{getter_name field.name}}() const { return _data->{{format_field_name __code_style field.name}}; }
+ {{~end~}}
+ {{~end~}}
+};
+
+{{namespace_with_grace_end __namespace}}
\ No newline at end of file
diff --git a/Config/Tools/Luban/Templates/cpp-sharedptr-bin/tables.sbn b/Config/Tools/Luban/Templates/cpp-sharedptr-bin/tables.sbn
new file mode 100644
index 0000000..76354d5
--- /dev/null
+++ b/Config/Tools/Luban/Templates/cpp-sharedptr-bin/tables.sbn
@@ -0,0 +1,23 @@
+class {{__name}}
+{
+ public:
+ {{~for table in __tables ~}}
+{{~if table.comment != '' ~}}
+ /**
+ * {{escape_comment table.comment}}
+ */
+{{~end~}}
+ {{make_cpp_name table.full_name}} {{table.name}};
+ {{~end~}}
+
+ bool load(::luban::Loader<::luban::ByteBuf> loader)
+ {
+ ::luban::ByteBuf buf;
+ {{~for table in __tables~}}
+ buf.clear();
+ if (!loader(buf, "{{table.output_data_file}}")) return false;
+ if (!{{table.name}}.load(buf)) return false;
+ {{~end~}}
+ return true;
+ }
+};
diff --git a/Config/Tools/Luban/Templates/cs-bin/bean.sbn b/Config/Tools/Luban/Templates/cs-bin/bean.sbn
new file mode 100644
index 0000000..4706226
--- /dev/null
+++ b/Config/Tools/Luban/Templates/cs-bin/bean.sbn
@@ -0,0 +1,150 @@
+using Luban;
+{{
+ parent_def_type = __bean.parent_def_type
+ export_fields = __bean.export_fields
+ hierarchy_export_fields = __bean.hierarchy_export_fields
+}}
+
+{{namespace_with_grace_begin __namespace_with_top_module}}
+{{~if __bean.comment != '' ~}}
+///
+/// {{escape_comment __bean.comment}}
+///
+{{~end~}}
+{{~
+func get_ref_name
+ ret (format_property_name __code_style $0.name) + '_Ref'
+end
+
+func get_index_var_name
+ ret (format_property_name __code_style $0.name) + '_Index'
+end
+
+func generate_resolve_field_ref
+ field = $0
+ fieldName = format_property_name __code_style field.name
+ refTable = get_ref_table field
+ if can_generate_ref field
+ tableName = format_property_name __code_style refTable.name
+ if field.is_nullable
+ ret (get_ref_name field) + ' = ' + fieldName + '!= null ? tables.' + tableName + '.GetOrDefault(' + (get_value_of_nullable_type field.ctype fieldName) + ') : null;'
+ else
+ ret (get_ref_name field) + ' = tables.' + tableName + '.GetOrDefault(' + fieldName + ');'
+ end
+ else if can_generate_collection_ref field
+ collection_ref_table = get_collection_ref_table field
+ tableName = format_property_name __code_style collection_ref_table.name
+ if field.ctype.type_name == 'list' || field.ctype.type_name == 'set'
+ line1 = (get_ref_name field) + ' = new ' + (declaring_collection_ref_name field.ctype) + '();' + '\n'
+ line2 = 'foreach (var _v in ' + fieldName + ') { ' + (get_ref_name field) + '.Add(tables.' + tableName + '.GetOrDefault(_v)); }' + '\n'
+ ret line1 + line2
+ else if field.ctype.type_name == 'array'
+ line1 = (get_ref_name field) + ' = new ' + (declaring_type_name collection_ref_table.value_ttype) + '[' + fieldName + '.Length];' + '\n'
+ line2 = 'for (int _i = 0; _i < ' + fieldName + '.Length; _i++) { ' + (get_ref_name field) + '[_i] = tables.' + tableName + '.GetOrDefault(' + fieldName + '[_i]); }' + '\n'
+ ret line1 + line2
+ else if field.ctype.type_name == 'map'
+ line1 = (get_ref_name field) + ' = new ' + (declaring_collection_ref_name field.ctype) + '();' + '\n'
+ line2 = 'foreach (var kvp in ' + fieldName + ') { ' + (get_ref_name field) + '.Add(kvp.Key, tables.' + tableName + '.GetOrDefault(kvp.Value)); }' + '\n'
+ ret line1 + line2
+ else
+ ret ''
+ end
+ else
+ if (is_field_bean_need_resolve_ref field)
+ ret fieldName + '?.ResolveRef(tables);'
+ else if (is_field_array_like_need_resolve_ref field)
+ ret 'foreach (var _e in ' + fieldName + ') { _e?.ResolveRef(tables); }'
+ else if (is_field_map_need_resolve_ref field)
+ ret 'foreach (var _e in ' + fieldName + '.Values) { _e?.ResolveRef(tables); }'
+ else
+ ret ''
+ end
+ end
+end
+~}}
+{{~if __bean.is_value_type~}}
+public partial struct {{__name}}
+{{~else~}}
+public {{class_modifier __bean}} partial class {{__name}} : {{if parent_def_type}}{{__bean.parent}}{{else}}Luban.BeanBase{{end}}
+{{~end~}}
+{
+ public {{__name}}(ByteBuf _buf) {{if parent_def_type}} : base(_buf) {{end}}
+ {
+ {{~ for field in export_fields
+ fieldName = format_property_name __code_style field.name
+ ~}}
+ {{deserialize '_buf' fieldName field.ctype}}
+ {{~if can_generate_ref field~}}
+ {{get_ref_name field}} = null;
+ {{~end~}}
+ {{~if has_index field~}}
+ foreach(var _v in {{fieldName}})
+ {
+ {{get_index_var_name field}}.Add(_v.{{format_property_name __code_style (get_index_field field).name}}, _v);
+ }
+ {{~end~}}
+ {{~end~}}
+ }
+
+ public static {{__name}} Deserialize{{__name}}(ByteBuf _buf)
+ {
+ {{~if __bean.is_abstract_type~}}
+ switch (_buf.ReadInt())
+ {
+ {{~for child in __bean.hierarchy_not_abstract_children~}}
+ case {{child.full_name}}.__ID__: return new {{child.full_name}}(_buf);
+ {{~end~}}
+ default: throw new SerializationException();
+ }
+ {{~else~}}
+ return new {{__bean.full_name}}(_buf);
+ {{~end~}}
+ }
+
+ {{~ for field in export_fields ~}}
+{{~if field.comment != '' ~}}
+ ///
+ /// {{escape_comment field.comment}}
+ ///
+{{~end~}}
+ public readonly {{declaring_type_name field.ctype}} {{format_property_name __code_style field.name}};
+ {{~if can_generate_ref field~}}
+ public {{declaring_type_name (get_ref_type field)}} {{get_ref_name field}};
+ {{~else if can_generate_collection_ref field~}}
+ public {{declaring_collection_ref_name field.ctype}} {{get_ref_name field}};
+ {{~end~}}
+ {{~if has_index field
+ indexMapType = get_index_map_type field
+ ~}}
+ public readonly {{declaring_type_name indexMapType}} {{get_index_var_name field}} = new {{declaring_type_name indexMapType}}();
+ {{~end~}}
+ {{~end~}}
+
+{{~if !__bean.is_abstract_type && !__bean.is_value_type~}}
+ public const int __ID__ = {{__bean.id}};
+ public override int GetTypeId() => __ID__;
+{{~end~}}
+
+ public {{method_modifier __bean}} void ResolveRef({{__manager_name}} tables)
+ {
+ {{~if parent_def_type~}}
+ base.ResolveRef(tables);
+ {{~end~}}
+ {{~for field in export_fields~}}
+ {{~ line = generate_resolve_field_ref field ~}}
+ {{~ if line != ''~}}
+ {{line}}
+ {{~end~}}
+ {{~end~}}
+ }
+
+ public override string ToString()
+ {
+ return "{{full_name}}{ "
+ {{~for field in hierarchy_export_fields ~}}
+ + "{{format_field_name __code_style field.name}}:" + {{to_pretty_string (format_property_name __code_style field.name) field.ctype}} + ","
+ {{~end~}}
+ + "}";
+ }
+}
+{{namespace_with_grace_end __namespace_with_top_module}}
diff --git a/Config/Tools/Luban/Templates/cs-bin/table.sbn b/Config/Tools/Luban/Templates/cs-bin/table.sbn
new file mode 100644
index 0000000..0e22269
--- /dev/null
+++ b/Config/Tools/Luban/Templates/cs-bin/table.sbn
@@ -0,0 +1,169 @@
+using Luban;
+
+{{
+ key_type = __table.key_ttype
+ value_type = __table.value_ttype
+
+ func index_type_name
+ ret (declaring_type_name $0.type)
+ end
+
+ func table_union_map_type_name
+ ret 'System.Collections.Generic.Dictionary<(' + (array.each __table.index_list @index_type_name | array.join ', ') + '), ' + (declaring_type_name value_type) + '>'
+ end
+
+ func table_key_list
+ varName = $0
+ indexList = __table.index_list |array.each do; ret varName + '.' + (format_property_name __code_style $0.index_field.name); end;
+ ret array.join indexList ', '
+ end
+
+ func table_param_def_list
+ paramList = __table.index_list |array.each do; ret (declaring_type_name $0.type) + ' ' + $0.index_field.name; end
+ ret array.join paramList ', '
+ end
+
+ func table_param_name_list
+ paramList = __table.index_list |array.each do; ret $0.index_field.name; end
+ ret array.join paramList ', '
+ end
+}}
+{{namespace_with_grace_begin __namespace_with_top_module}}
+{{~if __table.comment != '' ~}}
+///
+/// {{escape_comment __table.comment}}
+///
+{{~end~}}
+public partial class {{__name}}
+{
+ {{~if __table.is_map_table ~}}
+ private readonly System.Collections.Generic.Dictionary<{{declaring_type_name key_type}}, {{declaring_type_name value_type}}> _dataMap;
+ private readonly System.Collections.Generic.List<{{declaring_type_name value_type}}> _dataList;
+
+ public {{__name}}(ByteBuf _buf)
+ {
+ _dataMap = new System.Collections.Generic.Dictionary<{{declaring_type_name key_type}}, {{declaring_type_name value_type}}>();
+ _dataList = new System.Collections.Generic.List<{{declaring_type_name value_type}}>();
+
+ for(int n = _buf.ReadSize() ; n > 0 ; --n)
+ {
+ {{declaring_type_name value_type}} _v;
+ {{deserialize '_buf' '_v' value_type}}
+ _dataList.Add(_v);
+ _dataMap.Add(_v.{{format_property_name __code_style __table.index_field.name}}, _v);
+ }
+ }
+
+ public System.Collections.Generic.Dictionary<{{declaring_type_name key_type}}, {{declaring_type_name value_type}}> DataMap => _dataMap;
+ public System.Collections.Generic.List<{{declaring_type_name value_type}}> DataList => _dataList;
+
+{{~if value_type.is_dynamic~}}
+ public T GetOrDefaultAs({{declaring_type_name key_type}} key) where T : {{declaring_type_name value_type}} => _dataMap.TryGetValue(key, out var v) ? (T)v : null;
+ public T GetAs({{declaring_type_name key_type}} key) where T : {{declaring_type_name value_type}} => (T)_dataMap[key];
+{{~end~}}
+ public {{declaring_type_name value_type}} GetOrDefault({{declaring_type_name key_type}} key) => _dataMap.TryGetValue(key, out var v) ? v : null;
+ public {{declaring_type_name value_type}} Get({{declaring_type_name key_type}} key) => _dataMap[key];
+ public {{declaring_type_name value_type}} this[{{declaring_type_name key_type}} key] => _dataMap[key];
+
+ public void ResolveRef({{__manager_name}} tables)
+ {
+ {{~if is_bean_need_resolve_ref value_type ~}}
+ foreach(var _v in _dataList)
+ {
+ _v.ResolveRef(tables);
+ }
+ {{~end~}}
+ }
+
+ {{~else if __table.is_list_table ~}}
+ private readonly System.Collections.Generic.List<{{declaring_type_name value_type}}> _dataList;
+
+ {{~if __table.is_union_index~}}
+ private {{table_union_map_type_name}} _dataMapUnion;
+ {{~else if !__table.index_list.empty?~}}
+ {{~for idx in __table.index_list~}}
+ private System.Collections.Generic.Dictionary<{{declaring_type_name idx.type}}, {{declaring_type_name value_type}}> _dataMap_{{idx.index_field.name}};
+ {{~end~}}
+ {{~end~}}
+
+ public {{__name}}(ByteBuf _buf)
+ {
+ _dataList = new System.Collections.Generic.List<{{declaring_type_name value_type}}>();
+
+ for(int n = _buf.ReadSize() ; n > 0 ; --n)
+ {
+ {{declaring_type_name value_type}} _v;
+ {{deserialize '_buf' '_v' value_type}}
+ _dataList.Add(_v);
+ }
+ {{~if __table.is_union_index~}}
+ _dataMapUnion = new {{table_union_map_type_name}}();
+ foreach(var _v in _dataList)
+ {
+ _dataMapUnion.Add(({{table_key_list "_v"}}), _v);
+ }
+ {{~else if !__table.index_list.empty?~}}
+ {{~for idx in __table.index_list~}}
+ _dataMap_{{idx.index_field.name}} = new System.Collections.Generic.Dictionary<{{declaring_type_name idx.type}}, {{declaring_type_name value_type}}>();
+ {{~end~}}
+ foreach(var _v in _dataList)
+ {
+ {{~for idx in __table.index_list~}}
+ _dataMap_{{idx.index_field.name}}.Add(_v.{{format_property_name __code_style idx.index_field.name}}, _v);
+ {{~end~}}
+ }
+ {{~end~}}
+ }
+
+ public System.Collections.Generic.List<{{declaring_type_name value_type}}> DataList => _dataList;
+
+ {{~if __table.is_union_index~}}
+ public {{declaring_type_name value_type}} Get({{table_param_def_list}}) => _dataMapUnion.TryGetValue(({{table_param_name_list}}), out {{declaring_type_name value_type}} __v) ? __v : null;
+ {{~else if !__table.index_list.empty? ~}}
+ {{~for idx in __table.index_list~}}
+ public {{declaring_type_name value_type}} GetBy{{format_property_name __code_style idx.index_field.name}}({{declaring_type_name idx.type}} key) => _dataMap_{{idx.index_field.name}}.TryGetValue(key, out {{declaring_type_name value_type}} __v) ? __v : null;
+ {{~end~}}
+ {{~end~}}
+
+ public void ResolveRef({{__manager_name}} tables)
+ {
+ {{~if is_bean_need_resolve_ref value_type ~}}
+ foreach(var _v in _dataList)
+ {
+ _v.ResolveRef(tables);
+ }
+ {{~end~}}
+ }
+ {{~else~}}
+
+ private readonly {{declaring_type_name value_type}} _data;
+
+ public {{declaring_type_name value_type}} Data => _data;
+
+ public {{__name}}(ByteBuf _buf)
+ {
+ int n = _buf.ReadSize();
+ if (n != 1) throw new SerializationException("table mode=one, but size != 1");
+ {{deserialize '_buf' '_data' value_type}}
+ }
+
+
+ {{~ for field in value_type.def_bean.hierarchy_export_fields ~}}
+{{~if field.comment != '' ~}}
+ ///
+ /// {{escape_comment field.comment}}
+ ///
+{{~end~}}
+ public {{declaring_type_name field.ctype}} {{format_property_name __code_style field.name}} => _data.{{format_property_name __code_style field.name}};
+ {{~end~}}
+
+ public void ResolveRef({{__manager_name}} tables)
+ {
+ {{~if is_bean_need_resolve_ref value_type ~}}
+ _data.ResolveRef(tables);
+ {{~end~}}
+ }
+ {{~end~}}
+}
+
+{{namespace_with_grace_end __namespace_with_top_module}}
diff --git a/Config/Tools/Luban/Templates/cs-bin/tables.sbn b/Config/Tools/Luban/Templates/cs-bin/tables.sbn
new file mode 100644
index 0000000..be907ad
--- /dev/null
+++ b/Config/Tools/Luban/Templates/cs-bin/tables.sbn
@@ -0,0 +1,31 @@
+using Luban;
+
+{{namespace_with_grace_begin __namespace}}
+public partial class {{__name}}
+{
+ {{~for table in __tables ~}}
+{{~if table.comment != '' ~}}
+ ///
+ /// {{escape_comment table.comment}}
+ ///
+{{~end~}}
+ public {{table.full_name}} {{format_property_name __code_style table.name}} {get; }
+ {{~end~}}
+
+ public {{__name}}(System.Func loader)
+ {
+ {{~for table in __tables ~}}
+ {{format_property_name __code_style table.name}} = new {{table.full_name}}(loader("{{table.output_data_file}}"));
+ {{~end~}}
+ ResolveRef();
+ }
+
+ private void ResolveRef()
+ {
+ {{~for table in __tables ~}}
+ {{format_property_name __code_style table.name}}.ResolveRef(this);
+ {{~end~}}
+ }
+}
+
+{{namespace_with_grace_end __namespace}}
\ No newline at end of file
diff --git a/Config/Tools/Luban/Templates/cs-dotnet-json/bean.sbn b/Config/Tools/Luban/Templates/cs-dotnet-json/bean.sbn
new file mode 100644
index 0000000..d661e08
--- /dev/null
+++ b/Config/Tools/Luban/Templates/cs-dotnet-json/bean.sbn
@@ -0,0 +1,151 @@
+using Luban;
+using System.Text.Json;
+{{
+ parent_def_type = __bean.parent_def_type
+ export_fields = __bean.export_fields
+ hierarchy_export_fields = __bean.hierarchy_export_fields
+}}
+
+{{namespace_with_grace_begin __namespace_with_top_module}}
+{{~if __bean.comment != '' ~}}
+///
+/// {{escape_comment __bean.comment}}
+///
+{{~end~}}
+{{~
+func get_ref_name
+ ret (format_property_name __code_style $0.name) + '_Ref'
+end
+
+func get_index_var_name
+ ret (format_property_name __code_style $0.name) + '_Index'
+end
+
+func generate_resolve_field_ref
+ field = $0
+ fieldName = format_property_name __code_style field.name
+ refTable = get_ref_table field
+ if can_generate_ref field
+ tableName = format_property_name __code_style refTable.name
+ if field.is_nullable
+ ret (get_ref_name field) + ' = ' + fieldName + '!= null ? tables.' + tableName + '.GetOrDefault(' + (get_value_of_nullable_type field.ctype fieldName) + ') : null;'
+ else
+ ret (get_ref_name field) + ' = tables.' + tableName + '.GetOrDefault(' + fieldName + ');'
+ end
+ else if can_generate_collection_ref field
+ collection_ref_table = get_collection_ref_table field
+ tableName = format_property_name __code_style collection_ref_table.name
+ if field.ctype.type_name == 'list' || field.ctype.type_name == 'set'
+ line1 = (get_ref_name field) + ' = new ' + (declaring_collection_ref_name field.ctype) + '();' + '\n'
+ line2 = 'foreach (var _v in ' + fieldName + ') { ' + (get_ref_name field) + '.Add(tables.' + tableName + '.GetOrDefault(_v)); }' + '\n'
+ ret line1 + line2
+ else if field.ctype.type_name == 'array'
+ line1 = (get_ref_name field) + ' = new ' + (declaring_type_name collection_ref_table.value_ttype) + '[' + fieldName + '.Length];' + '\n'
+ line2 = 'for (int _i = 0; _i < ' + fieldName + '.Length; _i++) { ' + (get_ref_name field) + '[_i] = tables.' + tableName + '.GetOrDefault(' + fieldName + '[_i]); }' + '\n'
+ ret line1 + line2
+ else if field.ctype.type_name == 'map'
+ line1 = (get_ref_name field) + ' = new ' + (declaring_collection_ref_name field.ctype) + '();' + '\n'
+ line2 = 'foreach (var kvp in ' + fieldName + ') { ' + (get_ref_name field) + '.Add(kvp.Key, tables.' + tableName + '.GetOrDefault(kvp.Value)); }' + '\n'
+ ret line1 + line2
+ else
+ ret ''
+ end
+ else
+ if (is_field_bean_need_resolve_ref field)
+ ret fieldName + '?.ResolveRef(tables);'
+ else if (is_field_array_like_need_resolve_ref field)
+ ret 'foreach (var _e in ' + fieldName + ') { _e?.ResolveRef(tables); }'
+ else if (is_field_map_need_resolve_ref field)
+ ret 'foreach (var _e in ' + fieldName + '.Values) { _e?.ResolveRef(tables); }'
+ else
+ ret ''
+ end
+ end
+end
+~}}
+{{~if __bean.is_value_type~}}
+public partial struct {{__name}}
+{{~else~}}
+public {{class_modifier __bean}} partial class {{__name}} : {{if parent_def_type}}{{__bean.parent}}{{else}}Luban.BeanBase{{end}}
+{{~end~}}
+{
+ public {{__name}}(JsonElement _buf) {{if parent_def_type}} : base(_buf) {{end}}
+ {
+ {{~ for field in export_fields
+ fieldName = format_property_name __code_style field.name
+ ~}}
+ {{deserialize_field fieldName '_buf' field.name field.ctype}}
+ {{~if can_generate_ref field~}}
+ {{get_ref_name field}} = null;
+ {{~end~}}
+ {{~if has_index field~}}
+ foreach(var _v in {{fieldName}})
+ {
+ {{get_index_var_name field}}.Add(_v.{{format_property_name __code_style (get_index_field field).name}}, _v);
+ }
+ {{~end~}}
+ {{~end~}}
+ }
+
+ public static {{__name}} Deserialize{{__name}}(JsonElement _buf)
+ {
+ {{~if __bean.is_abstract_type~}}
+ switch (_buf.GetProperty("$type").GetString())
+ {
+ {{~for child in __bean.hierarchy_not_abstract_children~}}
+ case "{{impl_data_type child __bean}}": return new {{child.full_name}}(_buf);
+ {{~end~}}
+ default: throw new SerializationException();
+ }
+ {{~else~}}
+ return new {{__bean.full_name}}(_buf);
+ {{~end~}}
+ }
+
+ {{~ for field in export_fields ~}}
+{{~if field.comment != '' ~}}
+ ///
+ /// {{escape_comment field.comment}}
+ ///
+{{~end~}}
+ public readonly {{declaring_type_name field.ctype}} {{format_property_name __code_style field.name}};
+ {{~if can_generate_ref field~}}
+ public {{declaring_type_name (get_ref_type field)}} {{get_ref_name field}};
+ {{~else if can_generate_collection_ref field~}}
+ public {{declaring_collection_ref_name field.ctype}} {{get_ref_name field}};
+ {{~end~}}
+ {{~if has_index field
+ indexMapType = get_index_map_type field
+ ~}}
+ public readonly {{declaring_type_name indexMapType}} {{get_index_var_name field}} = new {{declaring_type_name indexMapType}}();
+ {{~end~}}
+ {{~end~}}
+
+{{~if !__bean.is_abstract_type && !__bean.is_value_type~}}
+ public const int __ID__ = {{__bean.id}};
+ public override int GetTypeId() => __ID__;
+{{~end~}}
+
+ public {{method_modifier __bean}} void ResolveRef({{__manager_name}} tables)
+ {
+ {{~if parent_def_type~}}
+ base.ResolveRef(tables);
+ {{~end~}}
+ {{~for field in export_fields~}}
+ {{~ line = generate_resolve_field_ref field ~}}
+ {{~ if line != ''~}}
+ {{line}}
+ {{~end~}}
+ {{~end~}}
+ }
+
+ public override string ToString()
+ {
+ return "{{full_name}}{ "
+ {{~for field in hierarchy_export_fields ~}}
+ + "{{format_field_name __code_style field.name}}:" + {{to_pretty_string (format_property_name __code_style field.name) field.ctype}} + ","
+ {{~end~}}
+ + "}";
+ }
+}
+{{namespace_with_grace_end __namespace_with_top_module}}
diff --git a/Config/Tools/Luban/Templates/cs-dotnet-json/table.sbn b/Config/Tools/Luban/Templates/cs-dotnet-json/table.sbn
new file mode 100644
index 0000000..fb473dd
--- /dev/null
+++ b/Config/Tools/Luban/Templates/cs-dotnet-json/table.sbn
@@ -0,0 +1,170 @@
+using Luban;
+using System.Text.Json;
+
+{{
+ key_type = __table.key_ttype
+ value_type = __table.value_ttype
+
+ func index_type_name
+ ret (declaring_type_name $0.type)
+ end
+
+ func table_union_map_type_name
+ ret 'System.Collections.Generic.Dictionary<(' + (array.each __table.index_list @index_type_name | array.join ', ') + '), ' + (declaring_type_name __value_type) + '>'
+ end
+
+ func table_key_list
+ varName = $0
+ indexList = __table.index_list |array.each do; ret varName + '.' + (format_property_name __code_style $0.index_field.name); end;
+ ret array.join indexList ', '
+ end
+
+ func table_param_def_list
+ paramList = __table.index_list |array.each do; ret (declaring_type_name $0.type) + ' ' + $0.index_field.name; end
+ ret array.join paramList ', '
+ end
+
+ func table_param_name_list
+ paramList = __table.index_list |array.each do; ret $0.index_field.name; end
+ ret array.join paramList ', '
+ end
+}}
+{{namespace_with_grace_begin __namespace_with_top_module}}
+{{~if __table.comment != '' ~}}
+///
+/// {{escape_comment __table.comment}}
+///
+{{~end~}}
+public partial class {{__name}}
+{
+ {{~if __table.is_map_table ~}}
+ private readonly System.Collections.Generic.Dictionary<{{declaring_type_name __key_type}}, {{declaring_type_name __value_type}}> _dataMap;
+ private readonly System.Collections.Generic.List<{{declaring_type_name __value_type}}> _dataList;
+
+ public {{__name}}(JsonElement _buf)
+ {
+ _dataMap = new System.Collections.Generic.Dictionary<{{declaring_type_name __key_type}}, {{declaring_type_name __value_type}}>();
+ _dataList = new System.Collections.Generic.List<{{declaring_type_name __value_type}}>();
+
+ foreach(JsonElement _ele in _buf.EnumerateArray())
+ {
+ {{declaring_type_name __value_type}} _v;
+ {{deserialize '_v' '_ele' __value_type}}
+ _dataList.Add(_v);
+ _dataMap.Add(_v.{{format_property_name __code_style __table.index_field.name}}, _v);
+ }
+ }
+
+ public System.Collections.Generic.Dictionary<{{declaring_type_name __key_type}}, {{declaring_type_name __value_type}}> DataMap => _dataMap;
+ public System.Collections.Generic.List<{{declaring_type_name __value_type}}> DataList => _dataList;
+
+{{~if __value_type.is_dynamic~}}
+ public T GetOrDefaultAs({{declaring_type_name __key_type}} key) where T : {{declaring_type_name __value_type}} => _dataMap.TryGetValue(key, out var v) ? (T)v : null;
+ public T GetAs({{declaring_type_name __key_type}} key) where T : {{declaring_type_name __value_type}} => (T)_dataMap[key];
+{{~end~}}
+ public {{declaring_type_name __value_type}} GetOrDefault({{declaring_type_name __key_type}} key) => _dataMap.TryGetValue(key, out var v) ? v : null;
+ public {{declaring_type_name __value_type}} Get({{declaring_type_name __key_type}} key) => _dataMap[key];
+ public {{declaring_type_name __value_type}} this[{{declaring_type_name __key_type}} key] => _dataMap[key];
+
+ public void ResolveRef({{__manager_name}} tables)
+ {
+ {{~if is_bean_need_resolve_ref value_type ~}}
+ foreach(var _v in _dataList)
+ {
+ _v.ResolveRef(tables);
+ }
+ {{~end~}}
+ }
+
+ {{~else if __table.is_list_table ~}}
+ private readonly System.Collections.Generic.List<{{declaring_type_name __value_type}}> _dataList;
+
+ {{~if __table.is_union_index~}}
+ private {{table_union_map_type_name}} _dataMapUnion;
+ {{~else if !__table.index_list.empty?~}}
+ {{~for idx in __table.index_list~}}
+ private System.Collections.Generic.Dictionary<{{declaring_type_name idx.type}}, {{declaring_type_name __value_type}}> _dataMap_{{idx.index_field.name}};
+ {{~end~}}
+ {{~end~}}
+
+ public {{__name}}(JsonElement _buf)
+ {
+ _dataList = new System.Collections.Generic.List<{{declaring_type_name __value_type}}>();
+
+ foreach(JsonElement _ele in _buf.EnumerateArray())
+ {
+ {{declaring_type_name __value_type}} _v;
+ {{deserialize '_v' '_ele' __value_type}}
+ _dataList.Add(_v);
+ }
+ {{~if __table.is_union_index~}}
+ _dataMapUnion = new {{table_union_map_type_name}}();
+ foreach(var _v in _dataList)
+ {
+ _dataMapUnion.Add(({{table_key_list "_v"}}), _v);
+ }
+ {{~else if !__table.index_list.empty?~}}
+ {{~for idx in __table.index_list~}}
+ _dataMap_{{idx.index_field.name}} = new System.Collections.Generic.Dictionary<{{declaring_type_name idx.type}}, {{declaring_type_name __value_type}}>();
+ {{~end~}}
+ foreach(var _v in _dataList)
+ {
+ {{~for idx in __table.index_list~}}
+ _dataMap_{{idx.index_field.name}}.Add(_v.{{format_property_name __code_style idx.index_field.name}}, _v);
+ {{~end~}}
+ }
+ {{~end~}}
+ }
+
+ public System.Collections.Generic.List<{{declaring_type_name __value_type}}> DataList => _dataList;
+
+ {{~if __table.is_union_index~}}
+ public {{declaring_type_name __value_type}} Get({{table_param_def_list}}) => _dataMapUnion.TryGetValue(({{table_param_name_list}}), out {{declaring_type_name __value_type}} __v) ? __v : null;
+ {{~else if !__table.index_list.empty? ~}}
+ {{~for idx in __table.index_list~}}
+ public {{declaring_type_name __value_type}} GetBy{{format_property_name __code_style idx.index_field.name}}({{declaring_type_name idx.type}} key) => _dataMap_{{idx.index_field.name}}.TryGetValue(key, out {{declaring_type_name __value_type}} __v) ? __v : null;
+ {{~end~}}
+ {{~end~}}
+
+ public void ResolveRef({{__manager_name}} tables)
+ {
+ {{~if is_bean_need_resolve_ref value_type ~}}
+ foreach(var _v in _dataList)
+ {
+ _v.ResolveRef(tables);
+ }
+ {{~end~}}
+ }
+ {{~else~}}
+
+ private readonly {{declaring_type_name __value_type}} _data;
+
+ public {{declaring_type_name __value_type}} Data => _data;
+
+ public {{__name}}(JsonElement _buf)
+ {
+ int n = _buf.GetArrayLength();
+ if (n != 1) throw new SerializationException("table mode=one, but size != 1");
+ {{deserialize '_data' '_buf[0]' __value_type}}
+ }
+
+
+ {{~ for field in __value_type.def_bean.hierarchy_export_fields ~}}
+{{~if field.comment != '' ~}}
+ ///
+ /// {{escape_comment field.comment}}
+ ///
+{{~end~}}
+ public {{declaring_type_name field.ctype}} {{format_property_name __code_style field.name}} => _data.{{format_property_name __code_style field.name}};
+ {{~end~}}
+
+ public void ResolveRef({{__manager_name}} tables)
+ {
+ {{~if is_bean_need_resolve_ref value_type ~}}
+ _data.ResolveRef(tables);
+ {{~end~}}
+ }
+ {{~end~}}
+}
+
+{{namespace_with_grace_end __namespace_with_top_module}}
diff --git a/Config/Tools/Luban/Templates/cs-dotnet-json/tables.sbn b/Config/Tools/Luban/Templates/cs-dotnet-json/tables.sbn
new file mode 100644
index 0000000..fcb1832
--- /dev/null
+++ b/Config/Tools/Luban/Templates/cs-dotnet-json/tables.sbn
@@ -0,0 +1,32 @@
+using Luban;
+using System.Text.Json;
+
+{{namespace_with_grace_begin __namespace}}
+public partial class {{__name}}
+{
+ {{~for table in __tables ~}}
+{{~if table.comment != '' ~}}
+ ///
+ /// {{escape_comment table.comment}}
+ ///
+{{~end~}}
+ public {{table.full_name}} {{format_property_name __code_style table.name}} {get; }
+ {{~end~}}
+
+ public {{__name}}(System.Func loader)
+ {
+ {{~for table in __tables ~}}
+ {{format_property_name __code_style table.name}} = new {{table.full_name}}(loader("{{table.output_data_file}}"));
+ {{~end~}}
+ ResolveRef();
+ }
+
+ private void ResolveRef()
+ {
+ {{~for table in __tables ~}}
+ {{format_property_name __code_style table.name}}.ResolveRef(this);
+ {{~end~}}
+ }
+}
+
+{{namespace_with_grace_end __namespace}}
\ No newline at end of file
diff --git a/Config/Tools/Luban/Templates/cs-editor-json/bean.sbn b/Config/Tools/Luban/Templates/cs-editor-json/bean.sbn
new file mode 100644
index 0000000..0ed8c8c
--- /dev/null
+++ b/Config/Tools/Luban/Templates/cs-editor-json/bean.sbn
@@ -0,0 +1,101 @@
+using System.Collections.Generic;
+using SimpleJSON;
+using Luban;
+
+{{namespace_with_grace_begin __namespace_with_top_module}}
+
+{{~if __this.comment != '' ~}}
+///
+/// {{escape_comment __this.comment}}
+///
+{{~end~}}
+public {{class_modifier __bean}} class {{__name}} : {{if __parent_def_type}} {{__this.parent}} {{else}} Luban.EditorBeanBase {{end}}
+{
+ public {{__name}}()
+ {
+ {{~ for field in __fields ~}}
+ {{~if (need_init field.ctype) && !field.ctype.is_nullable ~}}
+ {{format_field_name __code_style field.name}} = {{init_value field.ctype}};
+ {{~end~}}
+ {{~end~}}
+ }
+
+ {{~if !__this.is_abstract_type~}}
+ public override void LoadJson(SimpleJSON.JSONObject _json)
+ {
+ {{~ for field in __hierarchy_fields ~}}
+ {
+ var _fieldJson = _json["{{field.name}}"];
+ if (_fieldJson != null)
+ {
+ {{deserialize '_fieldJson' (format_field_name __code_style field.name) field.ctype}}
+ }
+ }
+
+ {{~end~}}
+ }
+
+ public override void SaveJson(SimpleJSON.JSONObject _json)
+ {
+ {{~if parent~}}
+ _json["$type"] = "{{__this.full_name}}";
+ {{~end~}}
+ {{~ for field in __hierarchy_fields ~}}
+ {{~if field.ctype.is_nullable}}
+ if ({{format_field_name __code_style field.name}} != null)
+ {
+ {{serialize '_json' field.name (format_field_name __code_style field.name) field.ctype}}
+ }
+ {{~else~}}
+ {
+ {{~if (is_raw_nullable field.ctype)}}
+ if ({{format_field_name __code_style field.name}} == null) { throw new System.ArgumentNullException(); }
+ {{~end~}}
+ {{serialize '_json' field.name (format_field_name __code_style field.name) field.ctype}}
+ }
+ {{~end~}}
+ {{~end~}}
+ }
+ {{~end~}}
+
+ public static {{__name}} LoadJson{{__name}}(SimpleJSON.JSONNode _json)
+ {
+ {{~if __this.is_abstract_type~}}
+ string type = _json["$type"];
+ {{__name}} obj;
+ switch (type)
+ {
+ {{~for child in __this.hierarchy_not_abstract_children~}}
+ {{~if child.namespace == __this.namespace && __this.namespace != '' ~}}
+ case "{{child.full_name}}":
+ {{~end~}}
+ case "{{impl_data_type child __this}}":obj = new {{child.full_name}}(); break;
+ {{~end~}}
+ default: throw new SerializationException();
+ }
+ {{~else~}}
+ {{__name}} obj = new {{__this.full_name}}();
+ {{~end~}}
+ obj.LoadJson((SimpleJSON.JSONObject)_json);
+ return obj;
+ }
+
+ public static void SaveJson{{__name}}({{__name}} _obj, SimpleJSON.JSONNode _json)
+ {
+ {{~if __this.is_abstract_type~}}
+ _json["$type"] = _obj.GetType().Name;
+ {{~end~}}
+ _obj.SaveJson((SimpleJSON.JSONObject)_json);
+ }
+
+ {{~ for field in __fields ~}}
+{{~if field.comment != '' ~}}
+ ///
+ /// {{escape_comment field.comment}}
+ ///
+{{~end~}}
+ public {{declaring_type_name field.ctype}} {{format_field_name __code_style field.name}};
+
+ {{~end~}}
+}
+{{namespace_with_grace_end __namespace_with_top_module}}
diff --git a/Config/Tools/Luban/Templates/cs-editor-json/enum.sbn b/Config/Tools/Luban/Templates/cs-editor-json/enum.sbn
new file mode 100644
index 0000000..fb36236
--- /dev/null
+++ b/Config/Tools/Luban/Templates/cs-editor-json/enum.sbn
@@ -0,0 +1,59 @@
+{{~
+ comment = __enum.comment
+ items = __enum.items
+ itemType = 'Luban.EditorEnumItemInfo'
+~}}
+
+{{namespace_with_grace_begin __namespace_with_top_module}}
+{{~if comment != '' ~}}
+ ///
+ /// {{escape_comment comment}}
+ ///
+{{~end~}}
+ {{~if __enum.is_flags~}}
+ [System.Flags]
+ {{~end~}}
+ public enum {{__name}}
+ {
+ {{~ for item in items ~}}
+{{~if item.comment != '' ~}}
+ ///
+ /// {{escape_comment item.comment_or_alias}}
+ ///
+{{~end~}}
+ {{format_enum_item_name __code_style item.name}} = {{item.value}},
+ {{~end~}}
+ }
+
+ public static class {{__name}}_Metadata
+ {
+ {{~ for item in items ~}}
+ public static readonly {{itemType}} {{item.name}} = new {{itemType}}("{{item.name}}", "{{item.alias}}", {{item.int_value}}, "{{item.comment}}");
+ {{~end~}}
+
+ private static readonly System.Collections.Generic.List<{{itemType}}> __items = new System.Collections.Generic.List<{{itemType}}>
+ {
+ {{~ for item in items ~}}
+ {{item.name}},
+ {{~end~}}
+ };
+
+ public static System.Collections.Generic.List<{{itemType}}> GetItems() => __items;
+
+ public static {{itemType}} GetByName(string name)
+ {
+ return __items.Find(c => c.Name == name);
+ }
+
+ public static {{itemType}} GetByNameOrAlias(string name)
+ {
+ return __items.Find(c => c.Name == name || c.Alias == name);
+ }
+
+ public static {{itemType}} GetByValue(int value)
+ {
+ return __items.Find(c => c.Value == value);
+ }
+ }
+
+{{namespace_with_grace_end __namespace_with_top_module}}
diff --git a/Config/Tools/Luban/Templates/cs-newtonsoft-json/bean.sbn b/Config/Tools/Luban/Templates/cs-newtonsoft-json/bean.sbn
new file mode 100644
index 0000000..f8ae9bd
--- /dev/null
+++ b/Config/Tools/Luban/Templates/cs-newtonsoft-json/bean.sbn
@@ -0,0 +1,158 @@
+using Luban;
+using Newtonsoft.Json.Linq;
+
+{{
+ parent_def_type = __bean.parent_def_type
+ export_fields = __bean.export_fields
+ hierarchy_export_fields = __bean.hierarchy_export_fields
+}}
+
+{{namespace_with_grace_begin __namespace_with_top_module}}
+{{~if __bean.comment != '' ~}}
+///
+/// {{escape_comment __bean.comment}}
+///
+{{~end~}}
+{{~
+func get_ref_name
+ ret (format_property_name __code_style $0.name) + '_Ref'
+end
+
+func get_index_var_name
+ ret (format_property_name __code_style $0.name) + '_Index'
+end
+
+
+func generate_resolve_field_ref
+ field = $0
+ fieldName = format_property_name __code_style field.name
+ refTable = get_ref_table field
+ if can_generate_ref field
+ tableName = format_property_name __code_style refTable.name
+ if field.is_nullable
+ ret (get_ref_name field) + ' = ' + fieldName + '!= null ? tables.' + tableName + '.GetOrDefault(' + (get_value_of_nullable_type field.ctype fieldName) + ') : null;'
+ else
+ ret (get_ref_name field) + ' = tables.' + tableName + '.GetOrDefault(' + fieldName + ');'
+ end
+ else if can_generate_collection_ref field
+ collection_ref_table = get_collection_ref_table field
+ tableName = format_property_name __code_style collection_ref_table.name
+ if field.ctype.type_name == 'list' || field.ctype.type_name == 'set'
+ line1 = (get_ref_name field) + ' = new ' + (declaring_collection_ref_name field.ctype) + '();' + '\n'
+ line2 = 'foreach (var _v in ' + fieldName + ') { ' + (get_ref_name field) + '.Add(tables.' + tableName + '.GetOrDefault(_v)); }' + '\n'
+ ret line1 + line2
+ else if field.ctype.type_name == 'array'
+ line1 = (get_ref_name field) + ' = new ' + (declaring_type_name collection_ref_table.value_ttype) + '[' + fieldName + '.Length];' + '\n'
+ line2 = 'for (int _i = 0; _i < ' + fieldName + '.Length; _i++) { ' + (get_ref_name field) + '[_i] = tables.' + tableName + '.GetOrDefault(' + fieldName + '[_i]); }' + '\n'
+ ret line1 + line2
+ else if field.ctype.type_name == 'map'
+ line1 = (get_ref_name field) + ' = new ' + (declaring_collection_ref_name field.ctype) + '();' + '\n'
+ line2 = 'foreach (var kvp in ' + fieldName + ') { ' + (get_ref_name field) + '.Add(kvp.Key, tables.' + tableName + '.GetOrDefault(kvp.Value)); }' + '\n'
+ ret line1 + line2
+ else
+ ret ''
+ end
+ else
+ if (is_field_bean_need_resolve_ref field)
+ ret fieldName + '?.ResolveRef(tables);'
+ else if (is_field_array_like_need_resolve_ref field)
+ ret 'foreach (var _e in ' + fieldName + ') { _e?.ResolveRef(tables); }'
+ else if (is_field_map_need_resolve_ref field)
+ ret 'foreach (var _e in ' + fieldName + '.Values) { _e?.ResolveRef(tables); }'
+ else
+ ret ''
+ end
+ end
+end
+
+~}}
+
+{{~if __bean.is_value_type~}}
+public partial struct {{__name}}
+{{~else~}}
+public {{class_modifier __bean}} partial class {{__name}} : {{if parent_def_type}}{{__bean.parent}}{{else}}Luban.BeanBase{{end}}
+{{~end~}}
+{
+ public {{__name}}(JToken _buf) {{if parent_def_type}} : base(_buf) {{end}}
+ {
+ JObject _obj = _buf as JObject;
+ {{~ for field in export_fields
+ fieldName = format_property_name __code_style field.name
+ ~}}
+ {{deserialize_field fieldName '_obj' field.name field.ctype}}
+ {{~if can_generate_ref field~}}
+ {{get_ref_name field}} = null;
+ {{~end~}}
+ {{~if has_index field~}}
+ foreach(var _v in {{fieldName}})
+ {
+ {{get_index_var_name field}}.Add(_v.{{format_property_name __code_style (get_index_field field).name}}, _v);
+ }
+ {{~end~}}
+ {{~end~}}
+ }
+
+ public static {{__name}} Deserialize{{__name}}(JToken _buf)
+ {
+ {{~if __bean.is_abstract_type~}}
+ var _obj=_buf as JObject;
+ switch (_obj.GetValue("$type").ToString())
+ {
+ {{~for child in __bean.hierarchy_not_abstract_children~}}
+ case "{{impl_data_type child __bean}}": return new {{child.full_name}}(_buf);
+ {{~end~}}
+ default: throw new SerializationException();
+ }
+ {{~else~}}
+ return new {{__bean.full_name}}(_buf);
+ {{~end~}}
+ }
+
+ {{~ for field in export_fields ~}}
+{{~if field.comment != '' ~}}
+ ///
+ /// {{escape_comment field.comment}}
+ ///
+{{~end~}}
+ public readonly {{declaring_type_name field.ctype}} {{format_property_name __code_style field.name}};
+ {{~if can_generate_ref field~}}
+ public {{declaring_type_name (get_ref_type field)}} {{get_ref_name field}};
+ {{~else if can_generate_collection_ref field~}}
+ public {{declaring_collection_ref_name field.ctype}} {{get_ref_name field}};
+ {{~end~}}
+ {{~if has_index field
+ indexMapType = get_index_map_type field
+ ~}}
+ public readonly {{declaring_type_name indexMapType}} {{get_index_var_name field}} = new {{declaring_type_name indexMapType}}();
+ {{~end~}}
+ {{~end~}}
+
+
+ {{~if !__bean.is_abstract_type && !__bean.is_value_type~}}
+ public const int __ID__ = {{__bean.id}};
+ public override int GetTypeId() => __ID__;
+ {{~end~}}
+
+ public {{method_modifier __bean}} void ResolveRef({{__manager_name}} tables)
+ {
+ {{~if parent_def_type~}}
+ base.ResolveRef(tables);
+ {{~end~}}
+ {{~for field in export_fields~}}
+ {{~ line = generate_resolve_field_ref field ~}}
+ {{~ if line != ''~}}
+ {{line}}
+ {{~end~}}
+ {{~end~}}
+ }
+
+ public override string ToString()
+ {
+ return "{{full_name}}{ "
+ {{~for field in hierarchy_export_fields ~}}
+ + "{{format_field_name __code_style field.name}}:" + {{to_pretty_string (format_property_name __code_style field.name) field.ctype}} + ","
+ {{~end~}}
+ + "}";
+ }
+}
+{{namespace_with_grace_end __namespace_with_top_module}}
diff --git a/Config/Tools/Luban/Templates/cs-newtonsoft-json/table.sbn b/Config/Tools/Luban/Templates/cs-newtonsoft-json/table.sbn
new file mode 100644
index 0000000..36ec214
--- /dev/null
+++ b/Config/Tools/Luban/Templates/cs-newtonsoft-json/table.sbn
@@ -0,0 +1,177 @@
+using Newtonsoft.Json.Linq;
+using Luban;
+
+{{
+ key_type = __table.key_ttype
+ value_type = __table.value_ttype
+
+ func index_type_name
+ ret (declaring_type_name $0.type)
+ end
+
+ func table_union_map_type_name
+ ret 'System.Collections.Generic.Dictionary<(' + (array.each __table.index_list @index_type_name | array.join ', ') + '), ' + (declaring_type_name __value_type) + '>'
+ end
+
+ func table_key_list
+ varName = $0
+ indexList = __table.index_list |array.each do; ret varName + '.' + (format_property_name __code_style $0.index_field.name); end;
+ ret array.join indexList ', '
+ end
+
+ func table_param_def_list
+ paramList = __table.index_list |array.each do; ret (declaring_type_name $0.type) + ' ' + $0.index_field.name; end
+ ret array.join paramList ', '
+ end
+
+ func table_param_name_list
+ paramList = __table.index_list |array.each do; ret $0.index_field.name; end
+ ret array.join paramList ', '
+ end
+}}
+
+{{namespace_with_grace_begin __namespace_with_top_module}}
+
+{{~if __table.comment != '' ~}}
+///
+/// {{escape_comment __table.comment}}
+///
+{{~end~}}
+public partial class {{__name}}
+{
+ {{~if __table.is_map_table ~}}
+ private readonly System.Collections.Generic.Dictionary<{{declaring_type_name __key_type}}, {{declaring_type_name __value_type}}> _dataMap;
+ private readonly System.Collections.Generic.List<{{declaring_type_name __value_type}}> _dataList;
+
+ public {{__name}}(JArray _buf)
+ {
+ _dataMap = new System.Collections.Generic.Dictionary<{{declaring_type_name __key_type}}, {{declaring_type_name __value_type}}>();
+ _dataList = new System.Collections.Generic.List<{{declaring_type_name __value_type}}>();
+
+ foreach(JObject _ele in _buf)
+ {
+ {{declaring_type_name __value_type}} _v;
+ {{deserialize '_v' '_ele' __value_type}}
+ _dataList.Add(_v);
+ _dataMap.Add(_v.{{format_property_name __code_style __table.index_field.name}}, _v);
+ }
+ }
+
+
+ public System.Collections.Generic.Dictionary<{{declaring_type_name __key_type}}, {{declaring_type_name __value_type}}> DataMap => _dataMap;
+ public System.Collections.Generic.List<{{declaring_type_name __value_type}}> DataList => _dataList;
+
+{{~if __value_type.is_dynamic~}}
+ public T GetOrDefaultAs({{declaring_type_name __key_type}} key) where T : {{declaring_type_name __value_type}} => _dataMap.TryGetValue(key, out var v) ? (T)v : null;
+ public T GetAs({{declaring_type_name __key_type}} key) where T : {{declaring_type_name __value_type}} => (T)_dataMap[key];
+{{~end~}}
+ public {{declaring_type_name __value_type}} GetOrDefault({{declaring_type_name __key_type}} key) => _dataMap.TryGetValue(key, out var v) ? v : null;
+ public {{declaring_type_name __value_type}} Get({{declaring_type_name __key_type}} key) => _dataMap[key];
+ public {{declaring_type_name __value_type}} this[{{declaring_type_name __key_type}} key] => _dataMap[key];
+
+ public void ResolveRef({{__manager_name}} tables)
+ {
+ {{~if is_bean_need_resolve_ref value_type ~}}
+ foreach(var _v in _dataList)
+ {
+ _v.ResolveRef(tables);
+ }
+ {{~end~}}
+ }
+
+ {{~else if __table.is_list_table ~}}
+ private readonly System.Collections.Generic.List<{{declaring_type_name __value_type}}> _dataList;
+
+ {{~if __table.is_union_index~}}
+ private {{table_union_map_type_name}} _dataMapUnion;
+ {{~else if !__table.index_list.empty?~}}
+ {{~for idx in __table.index_list~}}
+ private System.Collections.Generic.Dictionary<{{declaring_type_name idx.type}}, {{declaring_type_name __value_type}}> _dataMap_{{idx.index_field.name}};
+ {{~end~}}
+ {{~end~}}
+
+
+ public {{__name}}(JArray _buf)
+ {
+ _dataList = new System.Collections.Generic.List<{{declaring_type_name __value_type}}>();
+
+ foreach(JObject _ele in _buf)
+ {
+ {{declaring_type_name __value_type}} _v;
+ {{deserialize '_v' '_ele' __value_type}}
+ _dataList.Add(_v);
+ }
+ {{~if __table.is_union_index~}}
+ _dataMapUnion = new {{table_union_map_type_name}}();
+ foreach(var _v in _dataList)
+ {
+ _dataMapUnion.Add(({{table_key_list "_v"}}), _v);
+ }
+ {{~else if !__table.index_list.empty?~}}
+ {{~for idx in __table.index_list~}}
+ _dataMap_{{idx.index_field.name}} = new System.Collections.Generic.Dictionary<{{declaring_type_name idx.type}}, {{declaring_type_name __value_type}}>();
+ {{~end~}}
+ foreach(var _v in _dataList)
+ {
+ {{~for idx in __table.index_list~}}
+ _dataMap_{{idx.index_field.name}}.Add(_v.{{format_property_name __code_style idx.index_field.name}}, _v);
+ {{~end~}}
+ }
+ {{~end~}}
+ }
+
+ public System.Collections.Generic.List<{{declaring_type_name __value_type}}> DataList => _dataList;
+
+
+ {{~if __table.is_union_index~}}
+ public {{declaring_type_name __value_type}} Get({{table_param_def_list}}) => _dataMapUnion.TryGetValue(({{table_param_name_list}}), out {{declaring_type_name __value_type}} __v) ? __v : null;
+ {{~else if !__table.index_list.empty? ~}}
+ {{~for idx in __table.index_list~}}
+ public {{declaring_type_name __value_type}} GetBy{{format_property_name __code_style idx.index_field.name}}({{declaring_type_name idx.type}} key) => _dataMap_{{idx.index_field.name}}.TryGetValue(key, out {{declaring_type_name __value_type}} __v) ? __v : null;
+ {{~end~}}
+ {{~end~}}
+
+ public void ResolveRef({{__manager_name}} tables)
+ {
+ {{~if is_bean_need_resolve_ref value_type ~}}
+ foreach(var _v in _dataList)
+ {
+ _v.ResolveRef(tables);
+ }
+ {{~end~}}
+ }
+ {{~else~}}
+
+ private readonly {{declaring_type_name __value_type}} _data;
+
+ public {{declaring_type_name __value_type}} Data => _data;
+
+ public {{__name}}(JArray _buf)
+ {
+ int n = _buf.Count;
+ if (n != 1) throw new SerializationException("table mode=one, but size != 1");
+ {{deserialize '_data' '_buf[0]' __value_type}}
+ }
+
+
+ {{~ for field in __value_type.def_bean.hierarchy_export_fields ~}}
+{{~if field.comment != '' ~}}
+ ///
+ /// {{escape_comment field.comment}}
+ ///
+{{~end~}}
+ public {{declaring_type_name field.ctype}} {{format_property_name __code_style field.name}} => _data.{{format_property_name __code_style field.name}};
+ {{~end~}}
+
+ public void ResolveRef({{__manager_name}} tables)
+ {
+ {{~if is_bean_need_resolve_ref value_type ~}}
+ _data.ResolveRef(tables);
+ {{~end~}}
+ }
+
+
+
+ {{~end~}}
+}
+{{namespace_with_grace_end __namespace_with_top_module}}
diff --git a/Config/Tools/Luban/Templates/cs-newtonsoft-json/tables.sbn b/Config/Tools/Luban/Templates/cs-newtonsoft-json/tables.sbn
new file mode 100644
index 0000000..5f10e0a
--- /dev/null
+++ b/Config/Tools/Luban/Templates/cs-newtonsoft-json/tables.sbn
@@ -0,0 +1,32 @@
+using Newtonsoft.Json.Linq;
+
+{{namespace_with_grace_begin __namespace}}
+public partial class {{__name}}
+{
+ {{~for table in __tables ~}}
+{{~if table.comment != '' ~}}
+ ///
+ /// {{escape_comment table.comment}}
+ ///
+{{~end~}}
+ public {{table.full_name}} {{format_property_name __code_style table.name}} {get; }
+ {{~end~}}
+
+
+ public {{__name}}(System.Func loader)
+ {
+ {{~for table in __tables ~}}
+ {{format_property_name __code_style table.name}} = new {{table.full_name}}(loader("{{table.output_data_file}}"));
+ {{~end~}}
+ ResolveRef();
+ }
+
+ private void ResolveRef()
+ {
+ {{~for table in __tables ~}}
+ {{format_property_name __code_style table.name}}.ResolveRef(this);
+ {{~end~}}
+ }
+}
+
+{{namespace_with_grace_end __namespace}}
diff --git a/Config/Tools/Luban/Templates/cs-simple-json/bean.sbn b/Config/Tools/Luban/Templates/cs-simple-json/bean.sbn
new file mode 100644
index 0000000..1d7a4d9
--- /dev/null
+++ b/Config/Tools/Luban/Templates/cs-simple-json/bean.sbn
@@ -0,0 +1,151 @@
+using Luban;
+using SimpleJSON;
+{{
+ parent_def_type = __bean.parent_def_type
+ export_fields = __bean.export_fields
+ hierarchy_export_fields = __bean.hierarchy_export_fields
+}}
+
+{{namespace_with_grace_begin __namespace_with_top_module}}
+{{~if __bean.comment != '' ~}}
+///
+/// {{escape_comment __bean.comment}}
+///
+{{~end~}}
+{{~
+func get_ref_name
+ ret (format_property_name __code_style $0.name) + '_Ref'
+end
+
+func get_index_var_name
+ ret (format_property_name __code_style $0.name) + '_Index'
+end
+
+func generate_resolve_field_ref
+ field = $0
+ fieldName = format_property_name __code_style field.name
+ refTable = get_ref_table field
+ if can_generate_ref field
+ tableName = format_property_name __code_style refTable.name
+ if field.is_nullable
+ ret (get_ref_name field) + ' = ' + fieldName + '!= null ? tables.' + tableName + '.GetOrDefault(' + (get_value_of_nullable_type field.ctype fieldName) + ') : null;'
+ else
+ ret (get_ref_name field) + ' = tables.' + tableName + '.GetOrDefault(' + fieldName + ');'
+ end
+ else if can_generate_collection_ref field
+ collection_ref_table = get_collection_ref_table field
+ tableName = format_property_name __code_style collection_ref_table.name
+ if field.ctype.type_name == 'list' || field.ctype.type_name == 'set'
+ line1 = (get_ref_name field) + ' = new ' + (declaring_collection_ref_name field.ctype) + '();' + '\n'
+ line2 = 'foreach (var _v in ' + fieldName + ') { ' + (get_ref_name field) + '.Add(tables.' + tableName + '.GetOrDefault(_v)); }' + '\n'
+ ret line1 + line2
+ else if field.ctype.type_name == 'array'
+ line1 = (get_ref_name field) + ' = new ' + (declaring_type_name collection_ref_table.value_ttype) + '[' + fieldName + '.Length];' + '\n'
+ line2 = 'for (int _i = 0; _i < ' + fieldName + '.Length; _i++) { ' + (get_ref_name field) + '[_i] = tables.' + tableName + '.GetOrDefault(' + fieldName + '[_i]); }' + '\n'
+ ret line1 + line2
+ else if field.ctype.type_name == 'map'
+ line1 = (get_ref_name field) + ' = new ' + (declaring_collection_ref_name field.ctype) + '();' + '\n'
+ line2 = 'foreach (var kvp in ' + fieldName + ') { ' + (get_ref_name field) + '.Add(kvp.Key, tables.' + tableName + '.GetOrDefault(kvp.Value)); }' + '\n'
+ ret line1 + line2
+ else
+ ret ''
+ end
+ else
+ if (is_field_bean_need_resolve_ref field)
+ ret fieldName + '?.ResolveRef(tables);'
+ else if (is_field_array_like_need_resolve_ref field)
+ ret 'foreach (var _e in ' + fieldName + ') { _e?.ResolveRef(tables); }'
+ else if (is_field_map_need_resolve_ref field)
+ ret 'foreach (var _e in ' + fieldName + '.Values) { _e?.ResolveRef(tables); }'
+ else
+ ret ''
+ end
+ end
+end
+~}}
+{{~if __bean.is_value_type~}}
+public partial struct {{__name}}
+{{~else~}}
+public {{class_modifier __bean}} partial class {{__name}} : {{if parent_def_type}}{{__bean.parent}}{{else}}Luban.BeanBase{{end}}
+{{~end~}}
+{
+ public {{__name}}(JSONNode _buf) {{if parent_def_type}} : base(_buf) {{end}}
+ {
+ {{~ for field in export_fields
+ fieldName = format_property_name __code_style field.name
+ ~}}
+ {{deserialize_field fieldName '_buf' field.name field.ctype}}
+ {{~if can_generate_ref field~}}
+ {{get_ref_name field}} = null;
+ {{~end~}}
+ {{~if has_index field~}}
+ foreach(var _v in {{fieldName}})
+ {
+ {{get_index_var_name field}}.Add(_v.{{format_property_name __code_style (get_index_field field).name}}, _v);
+ }
+ {{~end~}}
+ {{~end~}}
+ }
+
+ public static {{__name}} Deserialize{{__name}}(JSONNode _buf)
+ {
+ {{~if __bean.is_abstract_type~}}
+ switch ((string)_buf["$type"])
+ {
+ {{~for child in __bean.hierarchy_not_abstract_children~}}
+ case "{{impl_data_type child __bean}}": return new {{child.full_name}}(_buf);
+ {{~end~}}
+ default: throw new SerializationException();
+ }
+ {{~else~}}
+ return new {{__bean.full_name}}(_buf);
+ {{~end~}}
+ }
+
+ {{~ for field in export_fields ~}}
+{{~if field.comment != '' ~}}
+ ///
+ /// {{escape_comment field.comment}}
+ ///
+{{~end~}}
+ public readonly {{declaring_type_name field.ctype}} {{format_property_name __code_style field.name}};
+ {{~if can_generate_ref field~}}
+ public {{declaring_type_name (get_ref_type field)}} {{get_ref_name field}};
+ {{~else if can_generate_collection_ref field~}}
+ public {{declaring_collection_ref_name field.ctype}} {{get_ref_name field}};
+ {{~end~}}
+ {{~if has_index field
+ indexMapType = get_index_map_type field
+ ~}}
+ public readonly {{declaring_type_name indexMapType}} {{get_index_var_name field}} = new {{declaring_type_name indexMapType}}();
+ {{~end~}}
+ {{~end~}}
+
+{{~if !__bean.is_abstract_type && !__bean.is_value_type~}}
+ public const int __ID__ = {{__bean.id}};
+ public override int GetTypeId() => __ID__;
+{{~end~}}
+
+ public {{method_modifier __bean}} void ResolveRef({{__manager_name}} tables)
+ {
+ {{~if parent_def_type~}}
+ base.ResolveRef(tables);
+ {{~end~}}
+ {{~for field in export_fields~}}
+ {{~ line = generate_resolve_field_ref field ~}}
+ {{~ if line != ''~}}
+ {{line}}
+ {{~end~}}
+ {{~end~}}
+ }
+
+ public override string ToString()
+ {
+ return "{{full_name}}{ "
+ {{~for field in hierarchy_export_fields ~}}
+ + "{{format_field_name __code_style field.name}}:" + {{to_pretty_string (format_property_name __code_style field.name) field.ctype}} + ","
+ {{~end~}}
+ + "}";
+ }
+}
+{{namespace_with_grace_end __namespace_with_top_module}}
diff --git a/Config/Tools/Luban/Templates/cs-simple-json/table.sbn b/Config/Tools/Luban/Templates/cs-simple-json/table.sbn
new file mode 100644
index 0000000..a07d492
--- /dev/null
+++ b/Config/Tools/Luban/Templates/cs-simple-json/table.sbn
@@ -0,0 +1,170 @@
+using Luban;
+using SimpleJSON;
+
+{{
+ key_type = __table.key_ttype
+ value_type = __table.value_ttype
+
+ func index_type_name
+ ret (declaring_type_name $0.type)
+ end
+
+ func table_union_map_type_name
+ ret 'System.Collections.Generic.Dictionary<(' + (array.each __table.index_list @index_type_name | array.join ', ') + '), ' + (declaring_type_name __value_type) + '>'
+ end
+
+ func table_key_list
+ varName = $0
+ indexList = __table.index_list |array.each do; ret varName + '.' + (format_property_name __code_style $0.index_field.name); end;
+ ret array.join indexList ', '
+ end
+
+ func table_param_def_list
+ paramList = __table.index_list |array.each do; ret (declaring_type_name $0.type) + ' ' + $0.index_field.name; end
+ ret array.join paramList ', '
+ end
+
+ func table_param_name_list
+ paramList = __table.index_list |array.each do; ret $0.index_field.name; end
+ ret array.join paramList ', '
+ end
+}}
+{{namespace_with_grace_begin __namespace_with_top_module}}
+{{~if __table.comment != '' ~}}
+///
+/// {{escape_comment __table.comment}}
+///
+{{~end~}}
+public partial class {{__name}}
+{
+ {{~if __table.is_map_table ~}}
+ private readonly System.Collections.Generic.Dictionary<{{declaring_type_name __key_type}}, {{declaring_type_name __value_type}}> _dataMap;
+ private readonly System.Collections.Generic.List<{{declaring_type_name __value_type}}> _dataList;
+
+ public {{__name}}(JSONNode _buf)
+ {
+ _dataMap = new System.Collections.Generic.Dictionary<{{declaring_type_name __key_type}}, {{declaring_type_name __value_type}}>();
+ _dataList = new System.Collections.Generic.List<{{declaring_type_name __value_type}}>();
+
+ foreach(JSONNode _ele in _buf.Children)
+ {
+ {{declaring_type_name __value_type}} _v;
+ {{deserialize '_v' '_ele' __value_type}}
+ _dataList.Add(_v);
+ _dataMap.Add(_v.{{format_property_name __code_style __table.index_field.name}}, _v);
+ }
+ }
+
+ public System.Collections.Generic.Dictionary<{{declaring_type_name __key_type}}, {{declaring_type_name __value_type}}> DataMap => _dataMap;
+ public System.Collections.Generic.List<{{declaring_type_name __value_type}}> DataList => _dataList;
+
+{{~if __value_type.is_dynamic~}}
+ public T GetOrDefaultAs({{declaring_type_name __key_type}} key) where T : {{declaring_type_name __value_type}} => _dataMap.TryGetValue(key, out var v) ? (T)v : null;
+ public T GetAs({{declaring_type_name __key_type}} key) where T : {{declaring_type_name __value_type}} => (T)_dataMap[key];
+{{~end~}}
+ public {{declaring_type_name __value_type}} GetOrDefault({{declaring_type_name __key_type}} key) => _dataMap.TryGetValue(key, out var v) ? v : null;
+ public {{declaring_type_name __value_type}} Get({{declaring_type_name __key_type}} key) => _dataMap[key];
+ public {{declaring_type_name __value_type}} this[{{declaring_type_name __key_type}} key] => _dataMap[key];
+
+ public void ResolveRef({{__manager_name}} tables)
+ {
+ {{~if is_bean_need_resolve_ref value_type ~}}
+ foreach(var _v in _dataList)
+ {
+ _v.ResolveRef(tables);
+ }
+ {{~end~}}
+ }
+
+ {{~else if __table.is_list_table ~}}
+ private readonly System.Collections.Generic.List<{{declaring_type_name __value_type}}> _dataList;
+
+ {{~if __table.is_union_index~}}
+ private {{table_union_map_type_name}} _dataMapUnion;
+ {{~else if !__table.index_list.empty?~}}
+ {{~for idx in __table.index_list~}}
+ private System.Collections.Generic.Dictionary<{{declaring_type_name idx.type}}, {{declaring_type_name __value_type}}> _dataMap_{{idx.index_field.name}};
+ {{~end~}}
+ {{~end~}}
+
+ public {{__name}}(JSONNode _buf)
+ {
+ _dataList = new System.Collections.Generic.List<{{declaring_type_name __value_type}}>();
+
+ foreach(JSONNode _ele in _buf.Children)
+ {
+ {{declaring_type_name __value_type}} _v;
+ {{deserialize '_v' '_ele' __value_type}}
+ _dataList.Add(_v);
+ }
+ {{~if __table.is_union_index~}}
+ _dataMapUnion = new {{table_union_map_type_name}}();
+ foreach(var _v in _dataList)
+ {
+ _dataMapUnion.Add(({{table_key_list "_v"}}), _v);
+ }
+ {{~else if !__table.index_list.empty?~}}
+ {{~for idx in __table.index_list~}}
+ _dataMap_{{idx.index_field.name}} = new System.Collections.Generic.Dictionary<{{declaring_type_name idx.type}}, {{declaring_type_name __value_type}}>();
+ {{~end~}}
+ foreach(var _v in _dataList)
+ {
+ {{~for idx in __table.index_list~}}
+ _dataMap_{{idx.index_field.name}}.Add(_v.{{format_property_name __code_style idx.index_field.name}}, _v);
+ {{~end~}}
+ }
+ {{~end~}}
+ }
+
+ public System.Collections.Generic.List<{{declaring_type_name __value_type}}> DataList => _dataList;
+
+ {{~if __table.is_union_index~}}
+ public {{declaring_type_name __value_type}} Get({{table_param_def_list}}) => _dataMapUnion.TryGetValue(({{table_param_name_list}}), out {{declaring_type_name __value_type}} __v) ? __v : null;
+ {{~else if !__table.index_list.empty? ~}}
+ {{~for idx in __table.index_list~}}
+ public {{declaring_type_name __value_type}} GetBy{{format_property_name __code_style idx.index_field.name}}({{declaring_type_name idx.type}} key) => _dataMap_{{idx.index_field.name}}.TryGetValue(key, out {{declaring_type_name __value_type}} __v) ? __v : null;
+ {{~end~}}
+ {{~end~}}
+
+ public void ResolveRef({{__manager_name}} tables)
+ {
+ {{~if is_bean_need_resolve_ref value_type ~}}
+ foreach(var _v in _dataList)
+ {
+ _v.ResolveRef(tables);
+ }
+ {{~end~}}
+ }
+ {{~else~}}
+
+ private readonly {{declaring_type_name __value_type}} _data;
+
+ public {{declaring_type_name __value_type}} Data => _data;
+
+ public {{__name}}(JSONNode _buf)
+ {
+ int n = _buf.Count;
+ if (n != 1) throw new SerializationException("table mode=one, but size != 1");
+ {{deserialize '_data' '_buf[0]' __value_type}}
+ }
+
+
+ {{~ for field in __value_type.def_bean.hierarchy_export_fields ~}}
+{{~if field.comment != '' ~}}
+ ///
+ /// {{escape_comment field.comment}}
+ ///
+{{~end~}}
+ public {{declaring_type_name field.ctype}} {{format_property_name __code_style field.name}} => _data.{{format_property_name __code_style field.name}};
+ {{~end~}}
+
+ public void ResolveRef({{__manager_name}} tables)
+ {
+ {{~if is_bean_need_resolve_ref value_type ~}}
+ _data.ResolveRef(tables);
+ {{~end~}}
+ }
+ {{~end~}}
+}
+
+{{namespace_with_grace_end __namespace_with_top_module}}
diff --git a/Config/Tools/Luban/Templates/cs-simple-json/tables.sbn b/Config/Tools/Luban/Templates/cs-simple-json/tables.sbn
new file mode 100644
index 0000000..66770e9
--- /dev/null
+++ b/Config/Tools/Luban/Templates/cs-simple-json/tables.sbn
@@ -0,0 +1,32 @@
+using Luban;
+using SimpleJSON;
+
+{{namespace_with_grace_begin __namespace}}
+public partial class {{__name}}
+{
+ {{~for table in __tables ~}}
+{{~if table.comment != '' ~}}
+ ///
+ /// {{escape_comment table.comment}}
+ ///
+{{~end~}}
+ public {{table.full_name}} {{format_property_name __code_style table.name}} {get; }
+ {{~end~}}
+
+ public {{__name}}(System.Func loader)
+ {
+ {{~for table in __tables ~}}
+ {{format_property_name __code_style table.name}} = new {{table.full_name}}(loader("{{table.output_data_file}}"));
+ {{~end~}}
+ ResolveRef();
+ }
+
+ private void ResolveRef()
+ {
+ {{~for table in __tables ~}}
+ {{format_property_name __code_style table.name}}.ResolveRef(this);
+ {{~end~}}
+ }
+}
+
+{{namespace_with_grace_end __namespace}}
\ No newline at end of file
diff --git a/Config/Tools/Luban/Templates/cs_pb/tables.sbn b/Config/Tools/Luban/Templates/cs_pb/tables.sbn
new file mode 100644
index 0000000..837061f
--- /dev/null
+++ b/Config/Tools/Luban/Templates/cs_pb/tables.sbn
@@ -0,0 +1,32 @@
+using Google.Protobuf;
+using Google.Protobuf.Collections;
+using System.Reflection;
+
+{{namespace_with_grace_begin __namespace}}
+public partial class {{__name}}
+{
+ {{~for table in __tables ~}}
+{{~if table.comment != '' ~}}
+ ///
+ /// {{escape_comment table.comment}}
+ ///
+{{~end~}}
+ public {{proto_full_name table.full_name}} {{format_property_name __code_style table.name}} { get; }
+
+ {{~end~}}
+
+ public {{__name}}(System.Func loader)
+ {
+ {{~for table in __tables ~}}
+ {{format_property_name __code_style table.name}} = {{proto_full_name table.full_name}}.Parser.ParseFrom(loader("{{table.output_data_file}}"));
+ {{~end~}}
+ }
+ public {{__name}}(System.Func loader)
+ {
+ {{~for table in __tables ~}}
+ {{format_property_name __code_style table.name}} = {{proto_full_name table.full_name}}.Parser.ParseJson(loader("{{table.output_data_file}}"));
+ {{~end~}}
+ }
+}
+
+{{namespace_with_grace_end __namespace}}
diff --git a/Config/Tools/Luban/Templates/dart-json/bean.sbn b/Config/Tools/Luban/Templates/dart-json/bean.sbn
new file mode 100644
index 0000000..c26884f
--- /dev/null
+++ b/Config/Tools/Luban/Templates/dart-json/bean.sbn
@@ -0,0 +1,143 @@
+import 'dart:ffi';
+import 'dart:collection';
+import '/gen/Tables.dart';
+
+{{~
+ parent_def_type = __this.parent_def_type
+ export_fields = __this.export_fields
+ hierarchy_export_fields = __this.hierarchy_export_fields
+~}}
+{{for field in hierarchy_export_fields}}{{import_ref_type_dart field '/gen/'}}{{end}}
+{{if parent_def_type}}{{declaring_import_bean parent_def_type '/gen/'}}{{end}}
+{{~if __bean.is_abstract_type~}}
+{{~for child in __this.hierarchy_not_abstract_children~}}
+{{declaring_import_bean child '/gen/'}}
+{{~end~}}
+{{~end~}}
+{{~
+func get_ref_name
+ ret (format_property_name __code_style $0.name) + '_Ref'
+end
+
+func generate_resolve_field_ref
+ field = $0
+ fieldName = format_name_lower_camel field.name
+ refTable = get_ref_table field
+ if can_generate_ref field
+ tableName = format_name_lower_camel refTable.name
+ if field.is_nullable
+ ret (get_ref_name field) + ' = ' + fieldName + '!= null ? tables.' + tableName + '?.getOrDefault(' + (get_value_of_nullable_type field.ctype fieldName) + ') : null;'
+ else
+ ret (get_ref_name field) + ' = tables.' + tableName + '?.getOrDefault(' + fieldName + ');'
+ end
+ else if can_generate_collection_ref field
+ collection_ref_table = get_collection_ref_table field
+ tableName = format_name_lower_camel collection_ref_table.name
+ if field.ctype.type_name == 'list' || field.ctype.type_name == 'array'
+ line1 = (get_ref_name field) + ' = ' + (declaring_collection_ref_name field.ctype) + '.empty(growable: true);' + '\n'
+ line2 = 'for (var _v in ' + fieldName + ') { var ref=(tables.'+tableName + '?.getOrDefault(_v))!;'+ (get_ref_name field) + '?.add(ref); }' + '\n'
+ ret line1 + line2
+ else if field.ctype.type_name == 'set'
+ line1 = (get_ref_name field) + ' = ' + (declaring_collection_ref_name field.ctype) + '();' + '\n'
+ line2 = 'for (var _v in ' + fieldName + ') { var ref= (tables.'+tableName + '?.getOrDefault(_v))!;'+ (get_ref_name field) + '?.add(ref); }' + '\n'
+ ret line1 + line2
+ else if field.ctype.type_name == 'map'
+ line1 = (get_ref_name field) + ' = ' + (declaring_collection_ref_name field.ctype) + '();' + '\n'
+ line2 = 'for (var kvp in ' + fieldName + '.entries) { var ref= (tables.' + tableName + '?.getOrDefault(kvp.value))!;' + (get_ref_name field) + '?[kvp.key]= ref; }' + '\n'
+ ret line1 + line2
+ else
+ ret ''
+ end
+ else
+ if (is_field_bean_need_resolve_ref field)
+ ret fieldName + '?.resolveRef(tables);'
+ else if (is_field_array_like_need_resolve_ref field)
+ ret 'for (var _e in ' + fieldName + ') { _e?.resolveRef(tables); }'
+ else if (is_field_map_need_resolve_ref field)
+ ret 'for (var _e in ' + fieldName + '.values) { _e?.resolveRef(tables); }'
+ else
+ ret ''
+ end
+ end
+end
+
+~}}
+{{~if __bean.comment != '' ~}}
+//{{escape_comment __bean.comment}}
+{{~end~}}
+{{class_modifier __this}} class {{__name}} {{if parent_def_type}}extends {{ __this.parent_def_type.name}}{{end}}
+{
+ {{__name}}(
+{{~if need_gen_constructor hierarchy_export_fields~}}
+ {
+{{~ for field in hierarchy_export_fields ~}}
+ {{~if is_super_field field parent_def_type~}}
+ required super.{{format_name_lower_camel field.name}},
+ {{~else~}}
+ required this.{{format_name_lower_camel field.name}},
+ {{~end~}}
+{{~end~}}
+ }
+ {{~end~}}
+ );
+
+ factory {{__name}}.deserialize(dynamic _buf){
+ {{~if __bean.is_abstract_type~}}
+ switch (_buf['\$type'])
+ {
+ {{~for child in __this.hierarchy_not_abstract_children~}}
+ case "{{impl_data_type child __this}}": return {{child.name}}.deserialize(_buf);
+ {{~end~}}
+ default: throw Exception('unknown type:$_buf[\$type]');
+ }
+ {{~else~}}
+{{~ for field in hierarchy_export_fields
+ fieldName = format_name_lower_camel field.name
+~}}
+ final {{fieldName}};
+ {{deserialize_field fieldName '_buf' field.name field.ctype}}
+{{~end~}}
+ return {{__name}}(
+{{~ for field in hierarchy_export_fields
+ fieldName = format_name_lower_camel field.name
+~}}
+ {{fieldName}}:{{fieldName}},
+{{~end~}}
+ );
+ {{~end~}}
+ }
+
+ {{~ for field in export_fields ~}}
+{{~if field.comment != '' ~}}
+ //{{escape_comment field.comment}}
+{{~end~}}
+ final {{declaring_type_name field.ctype}} {{format_name_lower_camel field.name}};
+{{~if can_generate_ref field~}}
+ {{declaring_type_name (get_ref_type field)}}? {{get_ref_name field}};
+{{~else if can_generate_collection_ref field~}}
+ {{declaring_collection_ref_name field.ctype}}? {{get_ref_name field}};
+{{~end~}}
+ {{~end~}}
+{{~if !__bean.is_abstract_type && !__bean.is_value_type~}}
+ static final int __ID__ = {{__this.id}};
+{{~end~}}
+ {{method_modifier __bean}}
+ void resolveRef({{__manager_name}} tables)
+ {
+ {{~if parent_def_type~}}
+ super.resolveRef(tables);
+ {{~end~}}
+
+ {{~for field in export_fields~}}
+ {{~ line = generate_resolve_field_ref field ~}}
+ {{~ if line != ''~}}
+ {{line}}
+ {{~end~}}
+ {{~end~}}
+ }
+
+ @override
+ String toString() {
+ return '{{__name}}({{for field in hierarchy_export_fields}}{{format_name_lower_camel field.name}}:${{format_name_lower_camel field.name}}, {{end}})';
+ }
+}
diff --git a/Config/Tools/Luban/Templates/dart-json/table.sbn b/Config/Tools/Luban/Templates/dart-json/table.sbn
new file mode 100644
index 0000000..57b66c7
--- /dev/null
+++ b/Config/Tools/Luban/Templates/dart-json/table.sbn
@@ -0,0 +1,145 @@
+import 'dart:collection';
+{{declaring_import_name __value_type '/gen/'}}
+{{~if __table.is_singleton_table ~}}
+{{for field in __value_type.def_bean.hierarchy_export_fields}}{{import_ref_type_dart field '/gen/'}}{{end}}
+{{~end~}}
+import '/gen/Tables.dart';
+{{
+ func index_type_name
+ ret (declaring_type_name $0.type)
+ end
+
+ func table_union_map_type_name
+ ret 'Map<(' + (array.each __table.index_list @index_type_name | array.join ', ') + '), ' + (declaring_type_name __value_type) + '>'
+ end
+
+ func table_key_list
+ varName = $0
+ indexList = __table.index_list |array.each do; ret varName + '.' + (format_property_name __code_style $0.index_field.name); end;
+ ret array.join indexList ', '
+ end
+
+ func table_param_def_list
+ paramList = __table.index_list |array.each do; ret (declaring_type_name $0.type) + ' ' + $0.index_field.name; end
+ ret array.join paramList ', '
+ end
+
+ func table_param_name_list
+ paramList = __table.index_list |array.each do; ret $0.index_field.name; end
+ ret array.join paramList ', '
+ end
+}}
+
+{{~if __this.comment != '' ~}}
+//{{escape_comment __this.comment}}
+{{~end~}}
+final class {{__name}} {
+
+ {{~if __table.is_map_table ~}}
+ final List<{{declaring_type_name __value_type}}> _dataList = [];
+ final Map<{{declaring_type_name __key_type}}, {{declaring_type_name __value_type}}> _dataMap = {};
+
+ {{__name}}(List _array) {
+
+ for (var _buf in _array) {
+
+ {{declaring_type_name __value_type}} _item = {{declaring_type_name __value_type}}.deserialize(_buf);
+
+ _dataList.add(_item);
+ _dataMap[_item.{{format_field_name __code_style __this.index_field.name}}] = _item;
+ }
+ }
+
+ {{declaring_type_name __value_type}}? getOrDefault({{declaring_type_name __key_type}} id) {
+ if (_dataMap.containsKey(id)) {
+ return _dataMap[id];
+ }
+ return null;
+ }
+
+ void resolveRef({{__manager_name}} tables)
+ {
+ for(var _v in _dataList)
+ {
+ _v.resolveRef(tables);
+ }
+ }
+
+ {{~else if __table.is_list_table ~}}
+ final List<{{declaring_type_name __value_type}}> _dataList = [];
+
+{{~if __table.is_union_index~}}
+ final {{table_union_map_type_name}} _dataMapUnion = {};
+{{~else if !__table.index_list.empty?~}}
+ {{~for idx in __table.index_list~}}
+ final Map<{{declaring_type_name idx.type}}, {{declaring_type_name __value_type}}> _dataMap_{{idx.index_field.name}}={};
+ {{~end~}}
+{{~end~}}
+
+ {{__name}}(List _array) {
+ for (var _buf in _array) {
+ {{declaring_type_name __value_type}} _item = {{declaring_type_name __value_type}}.deserialize(_buf);
+ _dataList.add(_item);
+ }
+
+ {{~if __table.is_union_index~}}
+ for(var _v in _dataList)
+ {
+ _dataMapUnion[({{table_key_list "_v"}})]= _v;
+ }
+ {{~else if !__table.index_list.empty?~}}
+ for(var _v in _dataList)
+ {
+ {{~for idx in __table.index_list~}}
+ _dataMap_{{idx.index_field.name}}[_v.{{format_property_name __code_style idx.index_field.name}}]= _v;
+ {{~end~}}
+ }
+ {{~end~}}
+ }
+
+ List<{{declaring_type_name __value_type}}> get dataList => _dataList;
+
+ {{~if __table.is_union_index~}}
+ {{declaring_type_name __value_type}}? get({{table_param_def_list}}) => _dataMapUnion[({{table_param_name_list}})];
+ {{~else if !__table.index_list.empty? ~}}
+ {{~for idx in __table.index_list~}}
+ {{declaring_type_name __value_type}}? getBy{{format_property_name __code_style idx.index_field.name}}({{declaring_type_name idx.type}} key) => _dataMap_{{idx.index_field.name}}[key];
+ {{~end~}}
+ {{~end~}}
+
+ void resolveRef({{__manager_name}} tables)
+ {
+
+ }
+ {{~else~}}
+
+ {{declaring_type_name __value_type}}? _data;
+
+ {{declaring_type_name __value_type}}? get data => _data;
+
+ {{__name}}(List _array) {
+
+ var n = _array.length;
+ if (n != 1)
+ {
+ throw Exception("table mode=one, but size != 1");
+ }
+ for (var _buf in _array) {
+ _data = {{declaring_type_name __value_type}}.deserialize(_buf);
+ }
+ }
+
+{{~ for field in __value_type.def_bean.hierarchy_export_fields ~}}
+{{~if field.comment != '' ~}}
+ ///
+ /// {{escape_comment field.comment}}
+ ///
+{{~end~}}
+ {{declaring_null_type_name field.ctype}} get {{format_property_name __code_style field.name}} => _data?.{{format_name_lower_camel field.name}};
+ {{~end~}}
+ void resolveRef({{__manager_name}} tables)
+ {
+
+ }
+ {{~end~}}
+}
diff --git a/Config/Tools/Luban/Templates/dart-json/tables.sbn b/Config/Tools/Luban/Templates/dart-json/tables.sbn
new file mode 100644
index 0000000..760be58
--- /dev/null
+++ b/Config/Tools/Luban/Templates/dart-json/tables.sbn
@@ -0,0 +1,43 @@
+{{~
+func get_table_inner_name
+ ret '_' + ($0 | string.downcase)
+end
+~}}
+{{~for table in __tables ~}}
+{{declaring_import_table table '/gen/'}}
+{{~end~}}
+final class {{__name}}
+{
+ final Future Function(String filePath) _asyncloadFunction;
+ Tables(this._asyncloadFunction);
+
+ {{~for table in __tables ~}}
+{{~if table.comment != '' ~}}
+ //{{escape_comment table.comment}}
+{{~end~}}
+ {{table.name}}? _{{format_property_name __code_style table.name}};
+ {{~end~}}
+
+ Future waitLoad() async {
+ var results = await Future.wait([
+ {{~for table in __tables ~}}
+ _asyncloadFunction("{{table.output_data_file}}"),
+ {{~end~}}
+ ]);
+ {{ idx=0 }}
+ {{~for table in __tables ~}}
+ _{{format_property_name __code_style table.name}} = {{table.name}}(results[{{idx}}]);{{idx=idx+1}}
+ {{~end~}}
+ resolveRef();
+ }
+{{~for table in __tables ~}}
+ {{table.name}}? get {{format_name_lower_camel table.name}} => _{{format_property_name __code_style table.name}};
+{{~end~}}
+
+ void resolveRef(){
+ {{~for table in __tables ~}}
+ _{{format_property_name __code_style table.name}}?.resolveRef(this);
+ {{~end~}}
+ }
+
+}
diff --git a/Config/Tools/Luban/Templates/flatbuffers/schema.sbn b/Config/Tools/Luban/Templates/flatbuffers/schema.sbn
new file mode 100644
index 0000000..ca8099c
--- /dev/null
+++ b/Config/Tools/Luban/Templates/flatbuffers/schema.sbn
@@ -0,0 +1,51 @@
+namespace {{__namespace}};
+
+{{~for enum in __enums
+ typeName = full_name enum
+ ~}}
+enum {{typeName}}:int {
+ {{~if !enum.has_zero_value_item~}}
+ __GENERATE_DEFAULT_VALUE = 0,
+ {{~end~}}
+ {{~for item in enum.items ~}}
+ {{typeName}}_{{item.name}} = {{item.int_value}},
+ {{~end~}}
+}
+{{~end~}}
+
+{{~for bean in __beans~}}
+{{~if bean.is_abstract_type ~}}
+union {{full_name bean}} {
+ {{~for c in bean.hierarchy_not_abstract_children~}}
+ {{full_name c}},
+ {{~end~}}
+}
+{{~end~}}
+{{~end~}}
+
+{{~for bean in __beans~}}
+{{~if !bean.is_abstract_type ~}}
+table {{full_name bean}} {
+ {{~for f in bean.hierarchy_export_fields ~}}
+ {{f.name}}:{{declaring_type_name f.ctype}}{{type_metadata f.ctype}};
+ {{~end~}}
+}
+{{~end~}}
+{{~end~}}
+
+{{~for map in __maps~}}
+table KeyValue_{{declaring_type_name map.key_type}}_{{declaring_type_name map.value_type}} {
+ key: {{declaring_type_name map.key_type}}{{type_metadata map.key_type}};
+ value: {{declaring_type_name map.value_type}}{{type_metadata map.value_type}};
+}
+{{~end~}}
+
+{{~for table in __tables~}}
+table {{full_name table}} {
+ // WARN! The name 'data_list' is used by FlatBuffersJsonExporter. don't modify it!
+ data_list:[{{declaring_type_name table.value_ttype}}](required);
+}
+
+root_type {{full_name table}};
+{{~end~}}
+
diff --git a/Config/Tools/Luban/Templates/gdscript-json/schema.sbn b/Config/Tools/Luban/Templates/gdscript-json/schema.sbn
new file mode 100644
index 0000000..dca9533
--- /dev/null
+++ b/Config/Tools/Luban/Templates/gdscript-json/schema.sbn
@@ -0,0 +1,167 @@
+@tool
+class_name Schema
+extends RefCounted
+
+
+{{~for enum in __enums~}}
+{{~if enum.comment != '' ~}}
+## {{enum.comment | html.escape}}
+{{~end~}}
+enum {{full_name enum}}
+{
+ {{~ for item in enum.items ~}}
+ {{~if item.comment_or_alias != '' ~}}
+ ## {{item.comment_or_alias | html.escape}}
+ {{~end~}}
+ {{item.name}} = {{item.value}},
+ {{~end~}}
+}
+
+
+{{~end~}}
+{{~for bean in __beans
+ name = (full_name bean)
+~}}
+{{~if bean.comment != '' ~}}
+## {{bean.comment | html.escape}}
+{{~end~}}
+class {{name}}{{if bean.parent_def_type}} extends {{full_name bean.parent_def_type}}{{end}}:
+{{~ for field in bean.export_fields ~}}
+ {{~if field.comment != '' ~}}
+ ## {{field.comment | html.escape}}
+ {{~end~}}
+ var {{format_field_name __code_style field.name}}: {{declaring_type_name field.ctype}}
+{{~end~}}
+
+{{~if bean.is_abstract_type~}}
+ static func fromJson(_json_):
+ var type = _json_['$type']
+ match type:
+ {{~ for child in bean.hierarchy_not_abstract_children~}}
+ "{{impl_data_type child bean}}": return {{full_name child}}.new(_json_)
+ {{~end~}}
+ _: assert(false)
+
+{{~end~}}
+ func _init(_json_) -> void:
+{{~if bean.parent_def_type~}}
+ super(_json_)
+{{~end~}}
+ {{~ for field in bean.export_fields ~}}
+ {{deserialize_field ('self.' + (format_field_name __code_style field.name)) '_json_' field.name field.ctype}}
+ {{~end~}}
+ {{~if bean.export_fields.empty?~}}
+ pass
+ {{~end~}}
+
+
+{{~end~}}
+{{~for table in __tables
+ value_type = table.value_ttype
+ value_type_name = (declaring_type_name value_type)
+~}}
+{{~if table.comment != '' ~}}
+## {{table.comment | html.escape}}
+{{~end~}}
+class {{full_name table}}:
+ {{~if table.is_map_table ~}}
+ var _data_list: Array[{{value_type_name}}]
+ var _data_map: Dictionary
+
+ func _init(_json_) -> void:
+ for _json2_ in _json_:
+ var _v: {{value_type_name}}
+ {{deserialize '_v' '_json2_' value_type}}
+ self._data_list.append(_v)
+ self._data_map[_v.{{format_field_name __code_style table.index_field.name}}] = _v
+
+ func get_data_list() -> Array[{{value_type_name}}]:
+ return self._data_list
+
+ func get_data_map() -> Dictionary:
+ return self._data_map
+
+ func get_item(key) -> {{value_type_name}}:
+ return self._data_map.get(key)
+
+ {{~else if table.multi_key ~}}
+ var _data_list: Array[{{value_type_name}}]
+ {{~ for INDEX in table.index_list ~}}
+ var _{{INDEX.index_field.name}}_data_map: Dictionary
+ {{~ end ~}}
+
+ func _init(_json_) -> void:
+ {{~ for INDEX in table.index_list ~}}
+ self._{{INDEX.index_field.name}}_data_map = {}
+ {{~ end ~}}
+
+ for _json2_ in _json_:
+ var _v: {{value_type_name}}
+ {{deserialize '_v' '_json2_' value_type}}
+ self._data_list.append(_v)
+ {{~ for INDEX in table.index_list ~}}
+ self._{{INDEX.index_field.name}}_data_map[_v.{{INDEX.index_field.name}}] = _v
+ {{~ end ~}}
+
+ func get_data_list() -> Array[{{value_type_name}}]:
+ return self._data_list
+
+ {{~ for INDEX in table.index_list ~}}
+ func get_{{INDEX.index_field.name}}_data_map() -> Dictionary:
+ return self._{{INDEX.index_field.name}}_data_map
+ {{~ end ~}}
+
+{{~ for INDEX in table.index_list ~}}
+ func get_item_by_{{INDEX.index_field.name}}({{INDEX.index_field.name}}) -> {{value_type_name}}:
+ return self._{{INDEX.index_field.name}}_data_map.get({{INDEX.index_field.name}})
+
+{{~ end ~}}
+ {{~else if table.is_list_table ~}}
+ var _data_list: Array[{{value_type_name}}]
+
+ func _init(_json_) -> void:
+ for _json2_ in _json_:
+ var _v: {{value_type_name}}
+ {{deserialize '_v' '_json2_' value_type}}
+ self._data_list.append(_v)
+
+ func get_data_list() -> Array[{{value_type_name}}]:
+ return self._data_list
+
+ func get_item(index) -> {{value_type_name}}:
+ return self._data_list[index]
+ {{~else~}}
+ var _data:{{value_type_name}}
+
+ func _init(_json_) -> void:
+ assert(len(_json_) == 1, "table mode = one, but size != 1")
+ {{deserialize 'self._data' '_json_[0]' value_type}}
+
+ func get_data() -> {{value_type_name}}:
+ return self._data
+
+ {{~ for field in value_type.def_bean.hierarchy_export_fields
+ name = format_field_name __code_style field.name
+ ~}}
+{{~if field.comment != '' ~}}
+ ## {{escape_comment field.comment}}
+{{~end~}}
+ var {{name}}: {{declaring_type_name field.ctype}}:
+ get: return self._data.{{name}}
+
+ {{~end~}}
+ {{~end~}}
+
+{{~end~}}
+class {{str_full_name __full_name}}:
+ {{~for table in __tables ~}}
+ {{~if table.comment != ''~}}
+ ## {{table.comment | html.escape}}
+ {{~end~}}
+ var {{format_method_name __code_style table.name}}: {{full_name table}}
+ {{~end~}}
+
+ func _init(loader: Callable) -> void:
+ {{~for table in __tables ~}}
+ self.{{format_method_name __code_style table.name}} = {{full_name table}}.new(loader.call('{{table.output_data_file}}'))
+ {{~end~}}
\ No newline at end of file
diff --git a/Config/Tools/Luban/Templates/go-bin/bean.sbn b/Config/Tools/Luban/Templates/go-bin/bean.sbn
new file mode 100644
index 0000000..0ff01a0
--- /dev/null
+++ b/Config/Tools/Luban/Templates/go-bin/bean.sbn
@@ -0,0 +1,54 @@
+{{~if ___top_module != ''~}}
+package {{__top_module}};
+{{~end~}}
+
+{{~
+ go_full_name = full_name __this
+ parent_def_type = __this.parent_def_type
+ is_abstract_type = __this.is_abstract_type
+ hierarchy_fields = __this.hierarchy_export_fields
+ hierarchy_not_abstract_children = __this.hierarchy_not_abstract_children
+~}}
+
+import (
+ "{{__luban_module_name}}"
+)
+
+{{collect_import __this}}
+
+type {{go_full_name}} struct {
+ {{~for field in hierarchy_fields ~}}
+ {{format_field_name __code_style field.name}} {{declaring_type_name field.ctype}}
+ {{~end~}}
+}
+
+const TypeId_{{go_full_name}} = {{__this.id}}
+
+func (*{{go_full_name}}) GetTypeId() int32 {
+ return {{__this.id}}
+}
+
+{{~if is_abstract_type~}}
+func New{{go_full_name}}(_buf *luban.ByteBuf) (interface{}, error) {
+ var id int32
+ var err error
+ if id, err = _buf.ReadInt() ; err != nil {
+ return nil, err
+ }
+ switch id {
+ {{~for child in hierarchy_not_abstract_children~}}
+ case {{child.id}}: _v, err := New{{full_name child}}(_buf); if err != nil { return nil, errors.New("{{child.full_name|string.downcase}}") } else { return _v, nil }
+ {{~end~}}
+ default: return nil, errors.New("unknown type id")
+ }
+}
+
+{{~else~}}
+func New{{go_full_name}}(_buf *luban.ByteBuf) (_v *{{go_full_name}}, err error) {
+ _v = &{{go_full_name}}{}
+ {{~for field in hierarchy_fields ~}}
+ {{deserialize_field field.ctype ("_v." + (format_field_name __code_style field.name)) '_buf' 'err'}}
+ {{~end~}}
+ return
+}
+{{~end~}}
diff --git a/Config/Tools/Luban/Templates/go-bin/table.sbn b/Config/Tools/Luban/Templates/go-bin/table.sbn
new file mode 100644
index 0000000..e511405
--- /dev/null
+++ b/Config/Tools/Luban/Templates/go-bin/table.sbn
@@ -0,0 +1,116 @@
+{{~if ___top_module != ''~}}
+package {{__top_module}};
+{{~end~}}
+
+{{~
+ go_full_name = full_name __this
+ key_type = __this.key_ttype
+ value_type = __this.value_ttype
+ index_field = __this.index_field
+~}}
+
+import "{{__luban_module_name}}"
+
+{{~if __this.is_map_table~}}
+type {{go_full_name}} struct {
+ _dataMap map[{{declaring_type_name key_type}}]{{declaring_type_name value_type}}
+ _dataList []{{declaring_type_name value_type}}
+}
+
+func New{{go_full_name}}(_buf *luban.ByteBuf) (*{{go_full_name}}, error) {
+ if size, err := _buf.ReadSize() ; err != nil {
+ return nil, err
+ } else {
+ _dataList := make([]{{declaring_type_name value_type}}, 0, size)
+ dataMap := make(map[{{declaring_type_name key_type}}]{{declaring_type_name value_type}})
+
+ for i := 0 ; i < size ; i++ {
+ if _v, err2 := New{{full_name value_type.def_bean}}(_buf); err2 != nil {
+ return nil, err2
+ } else {
+ _dataList = append(_dataList, _v)
+{{~if value_type.is_dynamic ~}}
+ {{~for child in value_type.def_bean.hierarchy_not_abstract_children~}}
+ if __v, __is := _v.(*{{full_name child}}) ; __is {
+ dataMap[__v.{{format_field_name __code_style index_field.name}}] = _v
+ continue
+ }
+ {{~end~}}
+{{~else~}}
+ dataMap[_v.{{format_field_name __code_style index_field.name}}] = _v
+{{~end~}}
+ }
+ }
+ return &{{go_full_name}}{_dataList:_dataList, _dataMap:dataMap}, nil
+ }
+}
+
+func (table *{{go_full_name}}) GetDataMap() map[{{declaring_type_name key_type}}]{{declaring_type_name value_type}} {
+ return table._dataMap
+}
+
+func (table *{{go_full_name}}) GetDataList() []{{declaring_type_name value_type}} {
+ return table._dataList
+}
+
+func (table *{{go_full_name}}) Get(key {{declaring_type_name key_type}}) {{declaring_type_name value_type}} {
+ return table._dataMap[key]
+}
+
+{{~else if __this.is_list_table~}}
+type {{go_full_name}} struct {
+ _dataList []{{declaring_type_name value_type}}
+}
+
+func New{{go_full_name}}(_buf *luban.ByteBuf) (*{{go_full_name}}, error) {
+ if size, err := _buf.ReadSize() ; err != nil {
+ return nil, err
+ } else {
+ _dataList := make([]{{declaring_type_name value_type}}, 0, size)
+
+ for i := 0 ; i < size ; i++ {
+ if _v, err2 := New{{full_name value_type.def_bean}}(_buf); err2 != nil {
+ return nil, err2
+ } else {
+ _dataList = append(_dataList, _v)
+ }
+ }
+ return &{{go_full_name}}{_dataList:_dataList}, nil
+ }
+}
+
+func (table *{{go_full_name}}) GetDataList() []{{declaring_type_name value_type}} {
+ return table._dataList
+}
+
+func (table *{{go_full_name}}) Get(index int) {{declaring_type_name value_type}} {
+ return table._dataList[index]
+}
+
+{{~else~}}
+
+import "errors"
+
+type {{go_full_name}} struct {
+ _data {{declaring_type_name value_type}}
+}
+
+func New{{go_full_name}}(_buf *luban.ByteBuf) (*{{go_full_name}}, error) {
+ if size, err := _buf.ReadSize() ; err != nil {
+ return nil, err
+ } else if size != 1 {
+ return nil, errors.New(" size != 1 ")
+ } else {
+ if _v, err2 := New{{full_name value_type.def_bean}}(_buf); err2 != nil {
+ return nil, err2
+ } else {
+ return &{{go_full_name}}{_data:_v}, nil
+ }
+ }
+}
+
+func (table *{{go_full_name}}) Get() {{declaring_type_name value_type}} {
+ return table._data
+}
+
+{{~end~}}
diff --git a/Config/Tools/Luban/Templates/go-bin/tables.sbn b/Config/Tools/Luban/Templates/go-bin/tables.sbn
new file mode 100644
index 0000000..4b0e7d1
--- /dev/null
+++ b/Config/Tools/Luban/Templates/go-bin/tables.sbn
@@ -0,0 +1,33 @@
+{{~if __namespace != ''~}}
+package {{__namespace}};
+{{~end~}}
+
+import (
+ "{{__luban_module_name}}"
+ "errors"
+)
+
+type ByteBufLoader func(string) (*luban.ByteBuf, error)
+
+type {{__name}} struct {
+ {{~for table in __tables ~}}
+ {{table.name}} *{{full_name table}}
+ {{~end~}}
+}
+
+func NewTables(loader ByteBufLoader) (*{{__name}}, error) {
+ var err error
+ var buf *luban.ByteBuf
+
+ tables := &{{__name}}{}
+ {{~for table in __tables ~}}
+ if buf, err = loader("{{table.output_data_file}}") ; err != nil {
+ return nil, err
+ }
+ if tables.{{table.name}}, err = New{{full_name table}}(buf) ; err != nil {
+ return nil, errors.Join(errors.New("failed to load {{table.name}}"), err)
+ }
+ {{~end~}}
+ return tables, nil
+}
+
diff --git a/Config/Tools/Luban/Templates/go-json/bean.sbn b/Config/Tools/Luban/Templates/go-json/bean.sbn
new file mode 100644
index 0000000..1da3b0e
--- /dev/null
+++ b/Config/Tools/Luban/Templates/go-json/bean.sbn
@@ -0,0 +1,50 @@
+{{~if ___top_module != ''~}}
+package {{__top_module}};
+{{~end~}}
+
+{{~
+ go_full_name = full_name __this
+ parent_def_type = __this.parent_def_type
+ is_abstract_type = __this.is_abstract_type
+ hierarchy_fields = __this.hierarchy_export_fields
+ hierarchy_not_abstract_children = __this.hierarchy_not_abstract_children
+~}}
+
+{{collect_import __this}}
+
+type {{go_full_name}} struct {
+ {{~for field in hierarchy_fields ~}}
+ {{format_field_name __code_style field.name}} {{declaring_type_name field.ctype}}
+ {{~end~}}
+}
+
+const TypeId_{{go_full_name}} = {{__this.id}}
+
+func (*{{go_full_name}}) GetTypeId() int32 {
+ return {{__this.id}}
+}
+
+{{~if is_abstract_type~}}
+func New{{go_full_name}}(_buf map[string]interface{}) (interface{}, error) {
+ var id string
+ var _ok_ bool
+ if id, _ok_ = _buf["$type"].(string) ; !_ok_ {
+ return nil, errors.New("type id missing")
+ }
+ switch id {
+ {{~for child in hierarchy_not_abstract_children~}}
+ case "{{impl_data_type child __this}}": _v, err := New{{full_name child}}(_buf); if err != nil { return nil, errors.New("{{full_name child|string.downcase}}") } else { return _v, nil }
+ {{~end~}}
+ default: return nil, errors.New("unknown type id")
+ }
+}
+
+{{~else~}}
+func New{{go_full_name}}(_buf map[string]interface{}) (_v *{{go_full_name}}, err error) {
+ _v = &{{go_full_name}}{}
+ {{~for field in hierarchy_fields ~}}
+ {{deserialize_field field.ctype ("_v." + (format_field_name __code_style field.name)) field.name '_buf'}}
+ {{~end~}}
+ return
+}
+{{~end~}}
diff --git a/Config/Tools/Luban/Templates/go-json/table.sbn b/Config/Tools/Luban/Templates/go-json/table.sbn
new file mode 100644
index 0000000..3fd5f9e
--- /dev/null
+++ b/Config/Tools/Luban/Templates/go-json/table.sbn
@@ -0,0 +1,103 @@
+{{~if ___top_module != ''~}}
+package {{__top_module}};
+{{~end~}}
+
+{{~
+ go_full_name = full_name __this
+ key_type = __this.key_ttype
+ value_type = __this.value_ttype
+ index_field = __this.index_field
+~}}
+
+{{~if __this.is_map_table~}}
+type {{go_full_name}} struct {
+ _dataMap map[{{declaring_type_name key_type}}]{{declaring_type_name value_type}}
+ _dataList []{{declaring_type_name value_type}}
+}
+
+func New{{go_full_name}}(_buf []map[string]interface{}) (*{{go_full_name}}, error) {
+ _dataList := make([]{{declaring_type_name value_type}}, 0, len(_buf))
+ dataMap := make(map[{{declaring_type_name key_type}}]{{declaring_type_name value_type}})
+
+ for _, _ele_ := range _buf {
+ if _v, err2 := New{{full_name value_type.def_bean}}(_ele_); err2 != nil {
+ return nil, err2
+ } else {
+ _dataList = append(_dataList, _v)
+{{~if value_type.is_dynamic ~}}
+ {{~for child in value_type.def_bean.hierarchy_not_abstract_children~}}
+ if __v, __is := _v.(*{{full_name child}}) ; __is {
+ dataMap[__v.{{format_field_name __code_style index_field.name}}] = _v
+ continue
+ }
+ {{~end~}}
+{{~else~}}
+ dataMap[_v.{{format_field_name __code_style index_field.name}}] = _v
+{{~end~}}
+ }
+ }
+ return &{{go_full_name}}{_dataList:_dataList, _dataMap:dataMap}, nil
+}
+
+func (table *{{go_full_name}}) GetDataMap() map[{{declaring_type_name key_type}}]{{declaring_type_name value_type}} {
+ return table._dataMap
+}
+
+func (table *{{go_full_name}}) GetDataList() []{{declaring_type_name value_type}} {
+ return table._dataList
+}
+
+func (table *{{go_full_name}}) Get(key {{declaring_type_name key_type}}) {{declaring_type_name value_type}} {
+ return table._dataMap[key]
+}
+
+{{~else if __this.is_list_table~}}
+type {{go_full_name}} struct {
+ _dataList []{{declaring_type_name value_type}}
+}
+
+func New{{go_full_name}}(_buf []map[string]interface{}) (*{{go_full_name}}, error) {
+ _dataList := make([]{{declaring_type_name value_type}}, 0, len(_buf))
+ for _, _ele_ := range _buf {
+ if _v, err2 := New{{full_name value_type.def_bean}}(_ele_); err2 != nil {
+ return nil, err2
+ } else {
+ _dataList = append(_dataList, _v)
+ }
+ }
+ return &{{go_full_name}}{_dataList:_dataList}, nil
+}
+
+func (table *{{go_full_name}}) GetDataList() []{{declaring_type_name value_type}} {
+ return table._dataList
+}
+
+func (table *{{go_full_name}}) Get(index int) {{declaring_type_name value_type}} {
+ return table._dataList[index]
+}
+
+{{~else~}}
+
+import "errors"
+
+type {{go_full_name}} struct {
+ _data {{declaring_type_name value_type}}
+}
+
+func New{{go_full_name}}(_buf []map[string]interface{}) (*{{go_full_name}}, error) {
+ if len(_buf) != 1 {
+ return nil, errors.New(" size != 1 ")
+ } else {
+ if _v, err2 := New{{full_name value_type.def_bean}}(_buf[0]); err2 != nil {
+ return nil, err2
+ } else {
+ return &{{go_full_name}}{_data:_v}, nil
+ }
+ }
+}
+
+func (table *{{go_full_name}}) Get() {{declaring_type_name value_type}} {
+ return table._data
+}
+
+{{~end~}}
diff --git a/Config/Tools/Luban/Templates/go-json/tables.sbn b/Config/Tools/Luban/Templates/go-json/tables.sbn
new file mode 100644
index 0000000..6f17482
--- /dev/null
+++ b/Config/Tools/Luban/Templates/go-json/tables.sbn
@@ -0,0 +1,28 @@
+{{~if __namespace != ''~}}
+package {{__namespace}};
+{{~end~}}
+
+type JsonLoader func(string) ([]map[string]interface{}, error)
+
+type {{__name}} struct {
+ {{~for table in __tables ~}}
+ {{table.name}} *{{full_name table}}
+ {{~end~}}
+}
+
+func NewTables(loader JsonLoader) (*{{__name}}, error) {
+ var err error
+ var buf []map[string]interface{}
+
+ tables := &{{__name}}{}
+ {{~for table in __tables ~}}
+ if buf, err = loader("{{table.output_data_file}}") ; err != nil {
+ return nil, err
+ }
+ if tables.{{table.name}}, err = New{{full_name table}}(buf) ; err != nil {
+ return nil, err
+ }
+ {{~end~}}
+ return tables, nil
+}
+
diff --git a/Config/Tools/Luban/Templates/java-bin/bean.sbn b/Config/Tools/Luban/Templates/java-bin/bean.sbn
new file mode 100644
index 0000000..39f90f0
--- /dev/null
+++ b/Config/Tools/Luban/Templates/java-bin/bean.sbn
@@ -0,0 +1,65 @@
+{{~if __namespace_with_top_module != ''~}}
+package {{__namespace_with_top_module}};
+{{~end~}}
+
+import luban.*;
+
+{{~
+ parent_def_type = __this.parent_def_type
+ export_fields = __this.export_fields
+ hierarchy_export_fields = __this.hierarchy_export_fields
+~}}
+
+{{~if __this.comment != '' ~}}
+/**
+ * {{escape_comment __this.comment}}
+ */
+{{~end~}}
+public {{class_modifier __this}} class {{__name}} extends {{if parent_def_type}}{{__this.parent_def_type.full_name_with_top_module}}{{else}}AbstractBean{{end}} {
+ public {{__name}}(ByteBuf _buf) {
+ {{~if parent_def_type~}}
+ super(_buf);
+ {{~end~}}
+ {{~ for field in export_fields ~}}
+ {{deserialize '_buf' (format_field_name __code_style field.name) field.ctype}}
+ {{~end~}}
+ }
+
+ public static {{__name}} deserialize(ByteBuf _buf) {
+ {{~if __this.is_abstract_type~}}
+ switch (_buf.readInt()) {
+ {{~for child in __this.hierarchy_not_abstract_children~}}
+ case {{child.full_name_with_top_module}}.__ID__: return new {{child.full_name_with_top_module}}(_buf);
+ {{~end~}}
+ default: throw new SerializationException();
+ }
+ {{~else~}}
+ return new {{__this.full_name_with_top_module}}(_buf);
+ {{~end~}}
+ }
+
+ {{~ for field in export_fields ~}}
+{{~if field.comment != '' ~}}
+ /**
+ * {{escape_comment field.comment}}
+ */
+{{~end~}}
+ public final {{declaring_type_name field.ctype}} {{format_field_name __code_style field.name}};
+ {{~end~}}
+
+{{~if !__this.is_abstract_type~}}
+ public static final int __ID__ = {{__this.id}};
+
+ @Override
+ public int getTypeId() { return __ID__; }
+{{~end~}}
+
+ @Override
+ public String toString() {
+ return "{{full_name}}{ "
+ {{~for field in hierarchy_export_fields ~}}
+ + "{{format_field_name __code_style field.name}}:" + {{format_field_name __code_style field.name}} + ","
+ {{~end~}}
+ + "}";
+ }
+}
diff --git a/Config/Tools/Luban/Templates/java-bin/table.sbn b/Config/Tools/Luban/Templates/java-bin/table.sbn
new file mode 100644
index 0000000..8f3c222
--- /dev/null
+++ b/Config/Tools/Luban/Templates/java-bin/table.sbn
@@ -0,0 +1,81 @@
+{{~if __namespace_with_top_module != ''~}}
+package {{__namespace_with_top_module}};
+{{~end~}}
+
+import luban.*;
+
+
+{{~if __this.comment != '' ~}}
+/**
+ * {{escape_comment __this.comment}}
+ */
+{{~end~}}
+public final class {{__name}} {
+ {{~if __this.is_map_table
+ key_type = __this.key_ttype
+ ~}}
+ private final java.util.HashMap<{{declaring_box_type_name key_type}}, {{declaring_box_type_name __value_type}}> _dataMap;
+ private final java.util.ArrayList<{{declaring_box_type_name __value_type}}> _dataList;
+
+ public {{__name}}(ByteBuf _buf) {
+ _dataMap = new java.util.HashMap<{{declaring_box_type_name key_type}}, {{declaring_box_type_name __value_type}}>();
+ _dataList = new java.util.ArrayList<{{declaring_box_type_name __value_type}}>();
+
+ for(int n = _buf.readSize() ; n > 0 ; --n) {
+ {{declaring_box_type_name __value_type}} _v;
+ {{deserialize '_buf' '_v' __value_type}}
+ _dataList.add(_v);
+ _dataMap.put(_v.{{format_field_name __code_style __this.index_field.name}}, _v);
+ }
+ }
+
+ public java.util.HashMap<{{declaring_box_type_name key_type}}, {{declaring_box_type_name __value_type}}> getDataMap() { return _dataMap; }
+ public java.util.ArrayList<{{declaring_box_type_name __value_type}}> getDataList() { return _dataList; }
+
+{{~if __value_type.is_dynamic~}}
+ @SuppressWarnings("unchecked")
+ public T getAs({{declaring_type_name key_type}} key) { return (T)_dataMap.get(key); }
+{{~end~}}
+ public {{declaring_box_type_name __value_type}} get({{declaring_type_name key_type}} key) { return _dataMap.get(key); }
+
+ {{~else if __this.is_list_table ~}}
+ private final java.util.ArrayList<{{declaring_box_type_name __value_type}}> _dataList;
+
+ public {{__name}}(ByteBuf _buf) {
+ _dataList = new java.util.ArrayList<{{declaring_box_type_name __value_type}}>();
+
+ for(int n = _buf.readSize() ; n > 0 ; --n) {
+ {{declaring_box_type_name __value_type}} _v;
+ {{deserialize '_buf' '_v' __value_type}}
+ _dataList.add(_v);
+ }
+ }
+
+ public java.util.ArrayList<{{declaring_box_type_name __value_type}}> getDataList() { return _dataList; }
+
+ public {{declaring_box_type_name __value_type}} get(int index) { return _dataList.get(index); }
+
+
+ {{~else~}}
+ private final {{declaring_type_name __value_type}} _data;
+
+ public final {{declaring_type_name __value_type}} data() { return _data; }
+
+ public {{__name}}(ByteBuf _buf) {
+ int n = _buf.readSize();
+ if (n != 1) throw new SerializationException("table mode=one, but size != 1");
+ {{deserialize '_buf' '_data' __value_type}}
+ }
+
+
+ {{~ for field in __value_type.def_bean.hierarchy_export_fields ~}}
+{{~if field.comment != '' ~}}
+ /**
+ * {{escape_comment field.comment}}
+ */
+{{~end~}}
+ public {{declaring_type_name field.ctype}} {{getter_name field.name}}() { return _data.{{format_field_name __code_style field.name}}; }
+ {{~end~}}
+
+ {{~end~}}
+}
\ No newline at end of file
diff --git a/Config/Tools/Luban/Templates/java-bin/tables.sbn b/Config/Tools/Luban/Templates/java-bin/tables.sbn
new file mode 100644
index 0000000..7ab77d8
--- /dev/null
+++ b/Config/Tools/Luban/Templates/java-bin/tables.sbn
@@ -0,0 +1,37 @@
+{{~if __namespace != ''~}}
+package {{__namespace}};
+{{~end~}}
+
+import luban.*;
+{{~
+func get_table_inner_name
+ ret '_' + ($0 | string.downcase)
+end
+~}}
+
+public final class {{__name}}
+{
+ public static interface IByteBufLoader {
+ ByteBuf load(String file) throws java.io.IOException;
+ }
+
+ {{~for table in __tables
+ inner_name = get_table_inner_name table.name
+ ~}}
+{{~if table.comment != '' ~}}
+ /**
+ * {{escape_comment table.comment}}
+ */
+{{~end~}}
+ private final {{table.full_name_with_top_module}} {{inner_name}};
+ public {{table.full_name_with_top_module}} get{{table.name}}() { return {{inner_name}}; }
+ {{~end~}}
+
+ public {{__name}}(IByteBufLoader loader) throws java.io.IOException {
+ {{~for table in __tables
+ inner_name = get_table_inner_name table.name
+ ~}}
+ {{inner_name}} = new {{table.full_name_with_top_module}}(loader.load("{{table.output_data_file}}"));
+ {{~end~}}
+ }
+}
diff --git a/Config/Tools/Luban/Templates/java-json/bean.sbn b/Config/Tools/Luban/Templates/java-json/bean.sbn
new file mode 100644
index 0000000..34fe415
--- /dev/null
+++ b/Config/Tools/Luban/Templates/java-json/bean.sbn
@@ -0,0 +1,67 @@
+{{~if __namespace_with_top_module != ''~}}
+package {{__namespace_with_top_module}};
+{{~end~}}
+
+import luban.*;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+
+{{~
+ parent_def_type = __this.parent_def_type
+ export_fields = __this.export_fields
+ hierarchy_export_fields = __this.hierarchy_export_fields
+~}}
+
+{{~if __this.comment != '' ~}}
+/**
+ * {{escape_comment __this.comment}}
+ */
+{{~end~}}
+public {{class_modifier __this}} class {{__name}} extends {{if parent_def_type}}{{__this.parent_def_type.full_name_with_top_module}}{{else}}AbstractBean{{end}} {
+ public {{__name}}(JsonObject _buf) {
+ {{~if parent_def_type~}}
+ super(_buf);
+ {{~end~}}
+ {{~ for field in export_fields ~}}
+ {{deserialize_field (format_field_name __code_style field.name) '_buf' field.name field.ctype}}
+ {{~end~}}
+ }
+
+ public static {{__name}} deserialize(JsonObject _buf) {
+ {{~if __this.is_abstract_type~}}
+ switch (_buf.get("$type").getAsString()) {
+ {{~for child in __this.hierarchy_not_abstract_children~}}
+ case "{{impl_data_type child __this}}": return new {{child.full_name_with_top_module}}(_buf);
+ {{~end~}}
+ default: throw new SerializationException();
+ }
+ {{~else~}}
+ return new {{__this.full_name_with_top_module}}(_buf);
+ {{~end~}}
+ }
+
+ {{~ for field in export_fields ~}}
+{{~if field.comment != '' ~}}
+ /**
+ * {{escape_comment field.comment}}
+ */
+{{~end~}}
+ public final {{declaring_type_name field.ctype}} {{format_field_name __code_style field.name}};
+ {{~end~}}
+
+{{~if !__this.is_abstract_type~}}
+ public static final int __ID__ = {{__this.id}};
+
+ @Override
+ public int getTypeId() { return __ID__; }
+{{~end~}}
+
+ @Override
+ public String toString() {
+ return "{{full_name}}{ "
+ {{~for field in hierarchy_export_fields ~}}
+ + "{{format_field_name __code_style field.name}}:" + {{format_field_name __code_style field.name}} + ","
+ {{~end~}}
+ + "}";
+ }
+}
diff --git a/Config/Tools/Luban/Templates/java-json/table.sbn b/Config/Tools/Luban/Templates/java-json/table.sbn
new file mode 100644
index 0000000..d4a5ebd
--- /dev/null
+++ b/Config/Tools/Luban/Templates/java-json/table.sbn
@@ -0,0 +1,82 @@
+{{~if __namespace_with_top_module != ''~}}
+package {{__namespace_with_top_module}};
+{{~end~}}
+
+import luban.*;
+import com.google.gson.JsonElement;
+
+
+{{~if __this.comment != '' ~}}
+/**
+ * {{escape_comment __this.comment}}
+ */
+{{~end~}}
+public final class {{__name}} {
+ {{~if __this.is_map_table
+ key_type = __this.key_ttype
+ ~}}
+ private final java.util.HashMap<{{declaring_box_type_name key_type}}, {{declaring_box_type_name __value_type}}> _dataMap;
+ private final java.util.ArrayList<{{declaring_box_type_name __value_type}}> _dataList;
+
+ public {{__name}}(JsonElement _buf) {
+ _dataMap = new java.util.HashMap<{{declaring_box_type_name key_type}}, {{declaring_box_type_name __value_type}}>();
+ _dataList = new java.util.ArrayList<{{declaring_box_type_name __value_type}}>();
+
+ for (com.google.gson.JsonElement _e_ : _buf.getAsJsonArray()) {
+ {{declaring_box_type_name __value_type}} _v;
+ {{deserialize '_v' '_e_' __value_type}}
+ _dataList.add(_v);
+ _dataMap.put(_v.{{format_field_name __code_style __this.index_field.name}}, _v);
+ }
+ }
+
+ public java.util.HashMap<{{declaring_box_type_name key_type}}, {{declaring_box_type_name __value_type}}> getDataMap() { return _dataMap; }
+ public java.util.ArrayList<{{declaring_box_type_name __value_type}}> getDataList() { return _dataList; }
+
+{{~if __value_type.is_dynamic~}}
+ @SuppressWarnings("unchecked")
+ public T getAs({{declaring_type_name key_type}} key) { return (T)_dataMap.get(key); }
+{{~end~}}
+ public {{declaring_box_type_name __value_type}} get({{declaring_type_name key_type}} key) { return _dataMap.get(key); }
+
+ {{~else if __this.is_list_table ~}}
+ private final java.util.ArrayList<{{declaring_box_type_name __value_type}}> _dataList;
+
+ public {{__name}}(JsonElement _buf) {
+ _dataList = new java.util.ArrayList<{{declaring_box_type_name __value_type}}>();
+
+ for (com.google.gson.JsonElement _e_ : _buf.getAsJsonArray()) {
+ {{declaring_box_type_name __value_type}} _v;
+ {{deserialize '_v' '_e_' __value_type}}
+ _dataList.add(_v);
+ }
+ }
+
+ public java.util.ArrayList<{{declaring_box_type_name __value_type}}> getDataList() { return _dataList; }
+
+ public {{declaring_box_type_name __value_type}} get(int index) { return _dataList.get(index); }
+
+
+ {{~else~}}
+ private final {{declaring_type_name __value_type}} _data;
+
+ public final {{declaring_type_name __value_type}} data() { return _data; }
+
+ public {{__name}}(JsonElement _buf) {
+ int n = _buf.getAsJsonArray().size();
+ if (n != 1) throw new SerializationException("table mode=one, but size != 1");
+ {{deserialize '_data' '_buf.getAsJsonArray().get(0).getAsJsonObject()' __value_type}}
+ }
+
+
+ {{~ for field in __value_type.def_bean.hierarchy_export_fields ~}}
+{{~if field.comment != '' ~}}
+ /**
+ * {{escape_comment field.comment}}
+ */
+{{~end~}}
+ public {{declaring_type_name field.ctype}} {{getter_name field.name}}() { return _data.{{format_field_name __code_style field.name}}; }
+ {{~end~}}
+
+ {{~end~}}
+}
\ No newline at end of file
diff --git a/Config/Tools/Luban/Templates/java-json/tables.sbn b/Config/Tools/Luban/Templates/java-json/tables.sbn
new file mode 100644
index 0000000..dbb624b
--- /dev/null
+++ b/Config/Tools/Luban/Templates/java-json/tables.sbn
@@ -0,0 +1,39 @@
+{{~if __namespace != ''~}}
+package {{__namespace}};
+{{~end~}}
+
+import luban.*;
+import com.google.gson.JsonElement;
+{{~
+func get_table_inner_name
+ ret '_' + ($0 | string.downcase)
+end
+~}}
+
+public final class {{__name}}
+{
+
+ public interface IJsonLoader {
+ JsonElement load(String file) throws java.io.IOException;
+ }
+
+ {{~for table in __tables
+ inner_name = get_table_inner_name table.name
+ ~}}
+{{~if table.comment != '' ~}}
+ /**
+ * {{escape_comment table.comment}}
+ */
+{{~end~}}
+ private final {{table.full_name_with_top_module}} {{inner_name}};
+ public {{table.full_name_with_top_module}} get{{table.name}}() { return {{inner_name}}; }
+ {{~end~}}
+
+ public {{__name}}(IJsonLoader loader) throws java.io.IOException {
+ {{~for table in __tables
+ inner_name = get_table_inner_name table.name
+ ~}}
+ {{inner_name}} = new {{table.full_name_with_top_module}}(loader.load("{{table.output_data_file}}"));
+ {{~end~}}
+ }
+}
diff --git a/Config/Tools/Luban/Templates/lua-bin/schema.sbn b/Config/Tools/Luban/Templates/lua-bin/schema.sbn
new file mode 100644
index 0000000..5a492a7
--- /dev/null
+++ b/Config/Tools/Luban/Templates/lua-bin/schema.sbn
@@ -0,0 +1,158 @@
+local setmetatable = setmetatable
+local pairs = pairs
+local ipairs = ipairs
+local tinsert = table.insert
+
+local function SimpleClass()
+ local class = {}
+ class.__index = class
+ class.New = function(...)
+ local ctor = class.ctor
+ local o = ctor and ctor(...) or {}
+ setmetatable(o, class)
+ return o
+ end
+ return class
+end
+
+
+local function get_map_size(m)
+ local n = 0
+ for _ in pairs(m) do
+ n = n + 1
+ end
+ return n
+end
+
+local enums =
+{
+ {{~ for c in __enums ~}}
+ ---@class {{c.full_name}} {{-if c.comment != ''}} @{{escape_comment c.comment}}{{end}}
+ {{~ for item in c.items ~}}
+ ---@field public {{item.name}} integer {{-if item.comment != ''}} @{{escape_comment item.comment}}{{end}}
+ {{~end~}}
+ ['{{c.full_name}}'] = { {{ for item in c.items }} {{item.name}}={{item.int_value}}, {{end}} };
+ {{~end~}}
+}
+
+local tables =
+{
+{{~for table in __tables ~}}
+ {{~if table.is_map_table ~}}
+ { name='{{table.name}}', file='{{table.output_data_file}}', mode='map', index='{{table.index}}', value_type='{{table.value_ttype.def_bean.full_name}}' },
+ {{~else if table.is_list_table ~}}
+ { name='{{table.name}}', file='{{table.output_data_file}}', mode='list', index='{{table.index}}', value_type='{{table.value_ttype.def_bean.full_name}}' },
+ {{~else~}}
+ { name='{{table.name}}', file='{{table.output_data_file}}', mode='one', value_type='{{table.value_ttype.def_bean.full_name}}'},
+ {{~end~}}
+{{~end~}}
+}
+
+local function InitTypes(methods)
+ local readBool = methods.readBool
+ local readByte = methods.readByte
+ local readShort = methods.readShort
+ local readFshort = methods.readFshort
+ local readInt = methods.readInt
+ local readFint = methods.readFint
+ local readLong = methods.readLong
+ local readFlong = methods.readFlong
+ local readFloat = methods.readFloat
+ local readDouble = methods.readDouble
+ local readSize = methods.readSize
+
+ local readString = methods.readString
+
+ local function readList(bs, keyFun)
+ local list = {}
+ local v
+ for i = 1, readSize(bs) do
+ tinsert(list, keyFun(bs))
+ end
+ return list
+ end
+
+ local readArray = readList
+
+ local function readSet(bs, keyFun)
+ local set = {}
+ local v
+ for i = 1, readSize(bs) do
+ tinsert(set, keyFun(bs))
+ end
+ return set
+ end
+
+ local function readMap(bs, keyFun, valueFun)
+ local map = {}
+ for i = 1, readSize(bs) do
+ local k = keyFun(bs)
+ local v = valueFun(bs)
+ map[k] = v
+ end
+ return map
+ end
+
+ local function readNullableBool(bs)
+ if readBool(bs) then
+ return readBool(bs)
+ end
+ end
+
+ local beans = {}
+ {{~ for bean in __beans ~}}
+ do
+ ---@class {{bean.full_name}} {{if bean.parent_def_type}}:{{bean.parent}} {{end}} {{-if bean.comment != ''}} @{{escape_comment bean.comment}}{{end}}
+ {{~ for field in bean.export_fields~}}
+ ---@field public {{field.name}} {{comment_type field.ctype}} {{-if field.comment != ''}} @{{escape_comment field.comment}}{{end}}
+ {{~end~}}
+ local class = {
+ {{~ for field in bean.export_fields~}}
+ { name='{{field.name}}', type='{{comment_type field.ctype}}'},
+ {{~end~}}
+ }
+ beans['{{bean.full_name}}'] = class
+ end
+ {{~end~}}
+
+ local beans = {}
+{{~ for bean in __beans ~}}
+ do
+ ---@class {{bean.full_name}} {{if bean.parent_def_type}}:{{bean.parent}} {{end}}
+ {{~ for field in bean.export_fields~}}
+ ---@field public {{field.name}} {{comment_type field.ctype}}
+ {{~end~}}
+ local class = SimpleClass()
+ class._id = {{bean.id}}
+ class._type_ = '{{bean.full_name}}'
+ local id2name = { {{for c in bean.hierarchy_not_abstract_children}} [{{c.id}}] = '{{c.full_name}}', {{end}} }
+{{~if bean.is_abstract_type~}}
+ class._deserialize = function(bs)
+ local id = readInt(bs)
+ return beans[id2name[id]]._deserialize(bs)
+ end
+{{~else~}}
+ class._deserialize = function(bs)
+ local o = {
+ {{~ for field in bean.hierarchy_export_fields ~}}
+ {{~if !(need_marshal_bool_prefix field.ctype)~}}
+ {{field.name}} = {{deserialize 'bs' field.ctype}},
+ {{~else~}}
+ {{field.name}} = {{if !field.ctype.is_bool}}readBool(bs) and {{deserialize 'bs' field.ctype}} or nil {{-else-}} readNullableBool(bs) {{-end-}},
+ {{~end~}}
+ {{~end~}}
+ }
+ setmetatable(o, class)
+ return o
+ end
+{{~end~}}
+ beans[class._type_] = class
+ end
+{{~end~}}
+
+
+ return { enums = enums, beans = beans, tables = tables }
+ end
+
+return { InitTypes = InitTypes }
+
diff --git a/Config/Tools/Luban/Templates/lua-lua/schema.sbn b/Config/Tools/Luban/Templates/lua-lua/schema.sbn
new file mode 100644
index 0000000..3a75e1a
--- /dev/null
+++ b/Config/Tools/Luban/Templates/lua-lua/schema.sbn
@@ -0,0 +1,42 @@
+
+local enums =
+{
+ {{~ for c in __enums ~}}
+ ---@class {{c.full_name}} {{-if c.comment != ''}} @{{escape_comment c.comment}}{{end}}
+ {{~ for item in c.items ~}}
+ ---@field public {{item.name}} integer {{-if item.comment != ''}} @{{escape_comment item.comment}}{{end}}
+ {{~end~}}
+ ['{{c.full_name}}'] = { {{ for item in c.items }} {{item.name}}={{item.int_value}}, {{end}} };
+ {{~end~}}
+}
+
+local beans = {}
+{{~ for bean in __beans ~}}
+ do
+ ---@class {{bean.full_name}} {{if bean.parent_def_type}}:{{bean.parent}} {{end}} {{-if bean.comment != ''}} @{{escape_comment bean.comment}}{{end}}
+ {{~ for field in bean.export_fields~}}
+ ---@field public {{field.name}} {{comment_type field.ctype}} {{-if field.comment != ''}} @{{escape_comment field.comment}}{{end}}
+ {{~end~}}
+ local class = {
+ {{~ for field in bean.export_fields~}}
+ { name='{{field.name}}', type='{{comment_type field.ctype}}'},
+ {{~end~}}
+ }
+ beans['{{bean.full_name}}'] = class
+ end
+{{~end~}}
+
+local tables =
+{
+{{~for table in __tables ~}}
+ {{~if table.is_map_table ~}}
+ { name='{{table.name}}', file='{{table.output_data_file}}', mode='map', index='{{table.index}}', value_type='{{table.value_ttype.def_bean.full_name}}' },
+ {{~else if table.is_list_table ~}}
+ { name='{{table.name}}', file='{{table.output_data_file}}', mode='list', index='{{table.index}}', value_type='{{table.value_ttype.def_bean.full_name}}' },
+ {{~else~}}
+ { name='{{table.name}}', file='{{table.output_data_file}}', mode='one', value_type='{{table.value_ttype.def_bean.full_name}}'},
+ {{~end~}}
+{{~end~}}
+}
+
+return { enums = enums, beans = beans, tables = tables }
diff --git a/Config/Tools/Luban/Templates/pb/schema.sbn b/Config/Tools/Luban/Templates/pb/schema.sbn
new file mode 100644
index 0000000..fce8035
--- /dev/null
+++ b/Config/Tools/Luban/Templates/pb/schema.sbn
@@ -0,0 +1,41 @@
+syntax = "{{__syntax}}";
+
+package {{__namespace}};
+
+{{~for enum in __enums
+ typeName = full_name enum
+ ~}}
+enum {{typeName}} {
+ {{~if !enum.has_zero_value_item ~}}
+ {{typeName}}_EMPTY_PLACEHOLDER = 0;
+ {{~end~}}
+ {{~for item in enum.items ~}}
+ {{typeName}}_{{item.name}} = {{item.int_value}};
+ {{~end~}}
+}
+{{~end~}}
+
+{{~for bean in __beans
+ typeName = full_name bean
+~}}
+message {{typeName}} {
+{{~if bean.is_abstract_type ~}}
+ oneof value {
+ {{~for c in bean.hierarchy_not_abstract_children~}}
+ {{full_name c}} {{c.name}} = {{c.auto_id}};
+ {{~end~}}
+ }
+{{~else~}}
+ {{~for f in bean.hierarchy_export_fields ~}}
+ {{pre_decorator f.ctype}} {{declaring_type_name f.ctype}} {{f.name}} = {{f.auto_id}} {{suffix_options f.ctype}};
+ {{~end~}}
+{{~end~}}
+}
+{{~end~}}
+
+{{~for table in __tables~}}
+message {{full_name table}} {
+ repeated {{declaring_type_name table.value_ttype}} data_list = 1 [packed = false];
+}
+{{~end~}}
+
diff --git a/Config/Tools/Luban/Templates/php-json/schema.sbn b/Config/Tools/Luban/Templates/php-json/schema.sbn
new file mode 100644
index 0000000..478c850
--- /dev/null
+++ b/Config/Tools/Luban/Templates/php-json/schema.sbn
@@ -0,0 +1,155 @@
+{{~namespace_with_grace_begin __namespace~}}
+
+{{~for enum in __enums~}}
+{{~if enum.comment != '' ~}}
+/**
+ * {{enum.comment | html.escape}}
+ */
+{{~end~}}
+class {{full_name enum}} {
+ {{~for item in enum.items ~}}
+{{~if item.comment != '' ~}}
+ /**
+ * {{escape_comment item.comment}}
+ */
+{{~end~}}
+ public const {{item.name}} = {{item.value}};
+ {{~end~}}
+}
+
+{{~end~}}
+
+
+{{~for bean in __beans~}}
+{{name = (full_name bean)}}
+{{~if bean.comment != '' ~}}
+/**
+ * {{escape_comment bean.comment}}
+ */
+{{~end~}}
+{{class_modifier bean}} class {{name}}{{if bean.parent_def_type}} extends {{full_name bean.parent_def_type}}{{end}} {
+{{~if bean.is_abstract_type~}}
+ public static function constructFrom($_json_) {
+ $type = $_json_['$type'];
+ switch ($type) {
+ {{~ for child in bean.hierarchy_not_abstract_children~}}
+ case '{{impl_data_type child bean}}': return new {{full_name child}}($_json_);
+ {{~end~}}
+ default: throw new \Exception("unknown type:$type");
+ }
+ }
+{{~end~}}
+
+ public function __construct($_json_) {
+ {{~if bean.parent_def_type~}}
+ parent::__construct($_json_);
+ {{~end~}}
+ {{~ for field in bean.export_fields ~}}
+ {{~if !field.ctype.is_nullable~}}
+ if (!array_key_exists('{{field.name}}', $_json_)) { throw new \Exception("field:'{{field.name}}' missing"); }
+ {{~end~}}
+ {{deserialize ('$this->' + format_field_name __code_style field.name) ( '$_json_[\'' + field.name + '\']') field.ctype}};
+ {{~end~}}
+ }
+
+ {{~ for field in bean.export_fields ~}}
+{{~if field.comment != '' ~}}
+ /**
+ * {{escape_comment field.comment}}
+ */
+{{~end~}}
+ public ${{format_field_name __code_style field.name}};
+ {{~end~}}
+}
+
+
+{{~end~}}
+
+{{~for table in __tables
+ key_type = table.key_ttype
+ value_type = table.value_ttype
+ name = (full_name table)
+~}}
+
+{{~if table.comment != '' ~}}
+/**
+ * {{escape_comment table.comment}}
+ */
+{{~end~}}
+class {{name}} {
+ {{~if table.is_map_table ~}}
+ private $_dataMap;
+ private $_dataList;
+ public function __construct($_json_) {
+ $this->_dataMap = [];
+ $this->_dataList = [];
+ foreach ($_json_ as $_json2_) {
+ {{deserialize '$_v' '$_json2_' value_type}};
+ array_push($this->_dataList, $_v);
+ $this->_dataMap[$_v->{{format_field_name __code_style table.index_field.name}}] = $_v;
+ }
+ }
+
+ public function getDataMap() { return $this->_dataMap; }
+ public function getDataList() { return $this->_dataList; }
+
+ public function get($key) { return $this->_dataMap[$key]; }
+
+ {{~else if table.is_list_table ~}}
+ private $_dataList;
+
+ public function __construct($_json_) {
+ $this->_dataList = [];
+ foreach ($_json_ as $_json2_) {
+ {{deserialize '$_v' '$_json2_' value_type}};
+ array_push($this->_dataList, $_v);
+ }
+ }
+
+ public function getDataList() { return $this->_dataList; }
+
+ public function get($index) { return $this->_dataList[$index]; }
+
+ {{~else~}}
+
+ private $_data;
+ public function __construct($_json_) {
+ if (count($_json_) != 1) throw new \Exception('table:{{table.name}} mode=one, but size != 1');
+ {{deserialize '$this->_data' '$_json_[0]' value_type}};
+ }
+
+ public function getData() { return $this->_data; }
+
+ {{~ for field in value_type.def_bean.hierarchy_export_fields ~}}
+{{~if field.comment != '' ~}}
+ /**
+ * {{escape_comment field.comment}}
+ */
+{{~end~}}
+ public function get{{format_field_name __code_style field.name}}() { return $this->_data->{{format_field_name __code_style field.name}}; }
+ {{~end~}}
+
+ {{end}}
+}
+
+{{~end~}}
+
+class {{__name}} {
+ {{~ for table in __tables ~}}
+ private $_{{table.name}};
+{{~if table.comment != '' ~}}
+ /**
+ * {{escape_comment table.comment}}
+ */
+{{~end~}}
+ public function get{{table.name}}() { return $this->_{{table.name}}; }
+ {{~end~}}
+
+ public function __construct($loader) {
+ {{~for table in __tables ~}}
+ $this->_{{table.name}} = new {{full_name table}}($loader('{{table.output_data_file}}'));
+ {{~end~}}
+ }
+}
+
+{{~namespace_with_grace_end __namespace~}}
diff --git a/Config/Tools/Luban/Templates/python-json/schema.sbn b/Config/Tools/Luban/Templates/python-json/schema.sbn
new file mode 100644
index 0000000..dfa6e4b
--- /dev/null
+++ b/Config/Tools/Luban/Templates/python-json/schema.sbn
@@ -0,0 +1,156 @@
+from enum import Enum
+{{
+
+ func table_key_list
+ table = $0
+ varName = $1
+ indexList = table.index_list |array.each do; ret varName + '.' + (format_property_name __code_style $0.index_field.name); end;
+ ret array.join indexList ', '
+ end
+
+ func table_param_name_list
+ table = $0
+ paramList = table.index_list |array.each do; ret $0.index_field.name; end
+ ret array.join paramList ', '
+ end
+}}
+
+{{~for enum in __enums~}}
+{{~if enum.comment != '' ~}}
+'''
+{{enum.comment | html.escape}}
+'''
+{{~end~}}
+class {{full_name enum}}(Enum):
+ {{~ for item in enum.items ~}}
+{{~if item.comment_or_alias != '' ~}}
+ '''
+ {{item.comment_or_alias | html.escape}}
+ '''
+{{~end~}}
+ {{item.name}} = {{item.value}}
+ {{~end~}}
+ {{~if enum.items.empty?~}}
+ pass
+ {{~end~}}
+
+{{~end~}}
+
+{{~for bean in __beans
+ name = (full_name bean)
+~}}
+class {{name}} {{if bean.parent_def_type}}({{full_name bean.parent_def_type}}){{end}}:
+{{~if bean.is_abstract_type~}}
+ _childrenTypes = None
+ @staticmethod
+ def fromJson(_json_):
+ childrenTypes = {{name}}._childrenTypes
+ if not childrenTypes:
+ childrenTypes = {{name}}._childrenTypes = {
+ {{~ for child in bean.hierarchy_not_abstract_children~}}
+ '{{impl_data_type child bean}}': {{name}},
+ {{~end~}}
+ }
+ type = _json_['$type']
+ child = {{name}}._childrenTypes.get(type)
+ if child != None:
+ return child(_json_)
+ else:
+ raise Exception()
+{{~end~}}
+ def __init__(self, _json_):
+ {{~if bean.parent_def_type~}}
+ {{full_name bean.parent_def_type}}.__init__(self, _json_)
+ {{~end~}}
+ {{~ for field in bean.export_fields ~}}
+ {{deserialize_field ('self.' + (format_field_name __code_style field.name)) '_json_' field.name field.ctype}}
+ {{~end~}}
+ {{~if bean.export_fields.empty?}}
+ pass
+ {{~end~}}
+
+{{~end~}}
+
+{{~for table in __tables
+ value_type = table.value_ttype
+~}}
+class {{full_name table}}:
+ {{~if table.is_map_table ~}}
+
+ def __init__(self, _json_ ):
+ self._dataMap = {}
+ self._dataList = []
+
+ for _json2_ in _json_:
+ {{deserialize '_v' '_json2_' value_type}}
+ self._dataList.append(_v)
+ self._dataMap[_v.{{format_field_name __code_style table.index_field.name}}] = _v
+
+ def getDataMap(self) : return self._dataMap
+ def getDataList(self) : return self._dataList
+
+ def get(self, key) : return self._dataMap.get(key)
+ {{~else if table.is_union_index~}}
+
+ def __init__(self, _json_ ):
+ self._dataMap = {}
+ self._dataList = []
+
+ for _json2_ in _json_:
+ {{deserialize '_v' '_json2_' value_type}}
+ self._dataList.append(_v)
+ self._dataMap[({{table_key_list table '_v'}})] = _v
+
+ def getDataMap(self) : return self._dataMap
+ def getDataList(self) : return self._dataList
+
+ def get(self, {{table_param_name_list table}}) : return self._dataMap.get(({{table_param_name_list table}}))
+
+ {{~else if table.is_list_table ~}}
+
+ def __init__(self, _json_ ):
+ self._dataList = []
+ {{~for idx in table.index_list~}}
+ self._dataMap_{{idx.index_field.name}} = {}
+ {{~end~}}
+ for _json2_ in _json_:
+ {{deserialize '_v' '_json2_' value_type}}
+ self._dataList.append(_v)
+ {{~for idx in table.index_list~}}
+ self._dataMap_{{idx.index_field.name}}[_v.{{format_property_name __code_style idx.index_field.name}}] = _v
+ {{~end~}}
+
+ def getDataList(self) : return self._dataList
+
+ def get(self, index) : return self._dataList[index]
+ {{~for idx in table.index_list~}}
+ def get_by_{{format_property_name __code_style idx.index_field.name}}(self, key): return self._dataMap_{{idx.index_field.name}}.get(key)
+ {{~end~}}
+ {{~else~}}
+
+ def __init__(self, _json_):
+ if (len(_json_) != 1): raise Exception('table mode=one, but size != 1')
+ {{deserialize 'self._data' '_json_[0]' value_type}}
+
+ def getData(self) : return self._data
+
+ {{~ for field in value_type.def_bean.hierarchy_export_fields ~}}
+{{~if field.comment != ''
+ name = format_field_name __code_style field.name
+~}}
+ '''
+ {{escape_comment field.comment}}
+ '''
+{{~end~}}
+ def {{name}}(self) : return self._data.{{name}}
+ {{~end~}}
+ {{~end~}}
+
+{{~end~}}
+
+
+class {{str_full_name __full_name}}:
+ def __init__(self, loader):
+ {{~for table in __tables ~}}
+ self.{{format_method_name __code_style table.name}} = {{full_name table}}(loader('{{table.output_data_file}}'));
+ {{~end~}}
diff --git a/Config/Tools/Luban/Templates/rust-bin/lib.sbn b/Config/Tools/Luban/Templates/rust-bin/lib.sbn
new file mode 100644
index 0000000..254110e
--- /dev/null
+++ b/Config/Tools/Luban/Templates/rust-bin/lib.sbn
@@ -0,0 +1,51 @@
+pub mod prelude{
+ pub use crate::*;
+{{~ for ns in __ns ~}}
+ pub use {{ns}}::*;
+{{~end~}}
+}
+{{~ if __polymorphic_beans.count != 0 ~}}
+
+type AbstractBase = dyn std::any::Any + Sync + Send;
+
+pub trait GetBase<'a, T> {
+ fn get_base(&'a self) -> Result;
+}
+{{~end~}}
+
+#[derive(Debug)]
+pub enum LubanError {
+ Loader(String),
+ Table(String),
+ Bean(String),
+ Polymorphic(String),
+ Unknown(String),
+}
+
+impl std::fmt::Display for LubanError {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ f.write_str(match self {
+ LubanError::Loader(msg) |
+ LubanError::Table(msg) |
+ LubanError::Bean(msg) |
+ LubanError::Polymorphic(msg) |
+ LubanError::Unknown(msg) => msg,
+ })
+ }
+}
+
+pub struct Tables{
+{{~ for table in __tables ~}}
+ pub {{table.name}}: std::sync::Arc<{{full_name table}}>,
+{{~end~}}
+}
+
+impl Tables {
+ pub fn new Result>(loader: T) -> Result {
+ Ok(Tables {
+{{~ for table in __tables ~}}
+ {{table.name}}: {{full_name table}}::new(loader("{{table.output_data_file}}")?)?,
+{{~end~}}
+ })
+ }
+}
\ No newline at end of file
diff --git a/Config/Tools/Luban/Templates/rust-bin/mod.sbn b/Config/Tools/Luban/Templates/rust-bin/mod.sbn
new file mode 100644
index 0000000..a844024
--- /dev/null
+++ b/Config/Tools/Luban/Templates/rust-bin/mod.sbn
@@ -0,0 +1,280 @@
+{{~ for mod in __mod.sub_mods ~}}
+pub mod {{mod.name}};
+{{~end~}}
+
+{{~ if __mod.name != '' ~}}
+use super::*;
+{{~end~}}
+use luban_lib::*;
+
+{{~ for enum in __mod.enums ~}}
+{{~ if enum.comment != '' ~}}
+///{{enum.comment | html.escape}}
+{{~end~}}
+{{~ if enum.is_flags ~}}
+bitflags::bitflags!{
+ #[derive(Debug, Hash, Eq, PartialEq)]
+ pub struct {{enum.name}} : u32 {
+ {{~ for item in enum.items ~}}
+ {{~if item.comment_or_alias != '' ~}}
+ ///{{item.comment_or_alias | html.escape}}
+ {{~end~}}
+ const {{item.name}} = {{item.int_value}};
+ {{~end~}}
+ }
+}
+{{~else~}}
+#[derive(Debug, Hash, Eq, PartialEq, macros::EnumFromNum)]
+pub enum {{enum.name}} {
+ {{~ for item in enum.items ~}}
+{{~if item.comment_or_alias != '' ~}}
+ ///{{item.comment_or_alias | html.escape}}
+{{~end~}}
+ {{item.name}} = {{item.value}},
+ {{~end~}}
+ {{~if enum.items.empty?~}}
+ None
+ {{~end~}}
+}
+
+impl From for {{enum.name}} {
+ fn from(value: i32) -> Self {
+ match value {
+ {{~ for item in enum.items ~}}
+ {{item.value}} => {{enum.name}}::{{item.name}},
+ {{~end~}}
+ _ => panic!("Invalid value for {{enum.name}}:{}", value),
+ }
+ }
+}
+
+{{~end~}}
+{{~end~}}
+{{~ for bean in __mod.beans
+ hierarchy_fields = bean.hierarchy_export_fields
+~}}
+#[derive(Debug)]
+{{~if bean.parent != ''~}}
+#[derive(macros::TryIntoBase)]
+{{~end~}}
+pub struct {{bean.name}} {
+ {{~ for field in hierarchy_fields ~}}
+{{~if field.comment != '' ~}}
+ /// {{escape_comment field.comment}}
+{{~end~}}
+ pub {{field.name}}: {{declaring_type_name field.ctype}},
+ {{~end~}}
+}
+{{~if bean.is_abstract_type~}}
+
+impl {{bean.name}} {
+ pub fn new(mut buf: &mut ByteBuf) -> Result, LubanError> {
+ let type_id = buf.read_int();
+ match type_id {
+ {{~for child in bean.hierarchy_not_abstract_children~}}
+ {{full_name child}}::__ID__ => Ok(std::sync::Arc::new({{full_name child}}::new(buf)?)),
+ {{~end~}}
+ _ => Err(LubanError::Bean(format!("Invalid type for {{bean.name}}:{}", type_id)))
+ }
+ }
+}
+
+pub trait T{{bean.name}} {
+ {{~ for field in hierarchy_fields ~}}
+ fn {{getter_name field.name}}(&self) -> &{{declaring_type_name field.ctype}};
+ {{~end~}}
+}
+{{~for child in bean.hierarchy_not_abstract_children~}}
+
+impl {{base_trait_name bean}} for {{full_name child}} {
+ {{~ for field in hierarchy_fields ~}}
+ fn {{getter_name field.name}}(&self) -> &{{declaring_type_name field.ctype}} {
+ &self.{{field.name}}
+ }
+ {{~end~}}
+}
+{{~end~}}
+
+impl<'a> GetBase<'a, &'a dyn {{base_trait_name bean}}> for AbstractBase {
+ fn get_base(&'a self) -> Result<&'a dyn {{base_trait_name bean}}, LubanError> {
+ {{~for child in bean.hierarchy_not_abstract_children~}}
+ let base: Result<&{{full_name child}}, _> = self.try_into();
+ if let Ok(r) = base {
+ return Ok(r);
+ }
+ {{~end~}}
+
+ Err(LubanError::Polymorphic(format!("Invalid type for {{bean.name}}")))
+ }
+}
+{{~else~}}
+
+impl {{bean.name}}{
+ pub fn new(mut buf: &mut ByteBuf) -> Result<{{bean.name}}, LubanError> {
+ {{~ for field in hierarchy_fields ~}}
+ {{deserialize field.name 'buf' field.ctype}}
+ {{~end~}}
+
+ Ok({{bean.name}} { {{ for field in hierarchy_fields }}{{field.name}}, {{end}}})
+ }
+
+ pub const __ID__: i32 = {{bean.id}};
+}
+{{~end~}}
+
+{{~end~}}
+{{~ for table in __mod.tables
+ key_type = declaring_type_name table.key_ttype
+ if table.value_ttype.def_bean.is_abstract_type
+ value_type = declaring_type_name table.value_ttype
+ else
+ value_type = "std::sync::Arc<"+declaring_type_name table.value_ttype+">"
+ end
+ name = table.name
+ map_type = "std::collections::HashMap<"+key_type+", "+value_type+">"
+~}}
+{{
+
+ func index_type_name
+ ret (declaring_type_name $0.type)
+ end
+
+ func table_union_map_type_name
+ ret 'std::collections::HashMap<(' + (array.each table.index_list @index_type_name | array.join ', ') + '), ' + value_type + '>'
+ end
+
+ func table_key_list
+ varName = $0
+ indexList = table.index_list |array.each do; ret varName + '.' + (format_property_name __code_style $0.index_field.name); end;
+ ret array.join indexList ', '
+ end
+
+ func table_param_def_list
+ paramList = table.index_list |array.each do; ret (declaring_type_name $0.type) + ' ' + $0.index_field.name; end
+ ret array.join paramList ', '
+ end
+
+ func table_param_name_list
+ paramList = table.index_list |array.each do; ret $0.index_field.name; end
+ ret array.join paramList ', '
+ end
+}}
+{{~ if table.comment != '' ~}}
+///{{table.comment | html.escape}}
+{{~end~}}
+#[derive(Debug)]
+pub struct {{table.name}} {
+ {{~if table.is_map_table ~}}
+ pub data_list: Vec<{{value_type}}>,
+ pub data_map: {{map_type}},
+ {{~else if table.is_list_table ~}}
+ pub data_list: Vec<{{value_type}}>,
+ {{~if table.is_union_index~}}
+ pub data_map_union: {{table_union_map_type_name}},
+ {{~else if !table.index_list.empty?~}}
+ {{~for idx in table.index_list~}}
+ pub data_map_{{idx.index_field.name}}: std::collections::HashMap<{{declaring_type_name idx.type}}, {{value_type}}>,
+ {{~end~}}
+ {{~end~}}
+ {{~else~}}
+ pub data: {{declaring_type_name table.value_ttype}},
+ {{~end~}}
+}
+{{~if table.is_map_table ~}}
+
+impl {{name}} {
+ pub fn new(mut buf: ByteBuf) -> Result, LubanError> {
+ let mut data_map: {{map_type}} = Default::default();
+ let mut data_list: Vec<{{value_type}}> = vec![];
+
+ for x in (0..buf.read_size()).rev() {
+ {{deserialize_row "row" "buf" table.value_ttype}}
+ data_list.push(row.clone());
+ {{~ if table.value_ttype.def_bean.is_abstract_type ~}}
+ let key = >::get_base(std::ops::Deref::deref(&row))?;
+ data_map.insert(key.{{getter_name table.index_field.name}}().clone(), row.clone());
+ {{~else~}}
+ data_map.insert(row.{{table.index_field.name}}.clone(), row.clone());
+ {{~end~}}
+ }
+
+ Ok(std::sync::Arc::new({{name}} { data_map, data_list }))
+ }
+
+ pub fn get(&self, key: &{{key_type}}) -> Option<{{value_type}}> {
+ self.data_map.get(key).map(|x| x.clone())
+ }
+}
+
+impl std::ops::Index<{{key_type}}> for {{name}} {
+ type Output = {{value_type}};
+
+ fn index(&self, index: {{key_type}}) -> &Self::Output {
+ &self.data_map.get(&index).unwrap()
+ }
+}
+{{~else if table.is_list_table ~}}
+
+impl {{name}} {
+ pub fn new(mut buf: ByteBuf) -> Result, LubanError> {
+ let mut data_list: Vec<{{value_type}}> = vec![];
+
+ for x in (0..buf.read_size()).rev() {
+ {{deserialize_row "row" "buf" table.value_ttype}}
+ data_list.push(row.clone());
+ }
+ {{~if table.is_union_index~}}
+ let mut data_map_union: {{table_union_map_type_name}} = Default::default();
+ for x in &data_list {
+ data_map_union.insert(({{table_key_list "x"}}.clone()), x.clone());
+ }
+ {{~else if !table.index_list.empty?~}}
+ {{~for idx in table.index_list~}}
+ let mut data_map_{{idx.index_field.name}}: std::collections::HashMap<{{declaring_type_name idx.index_field.ctype}}, {{value_type}}> = Default::default();
+ {{~end~}}
+ for x in &data_list {
+ {{~for idx in table.index_list~}}
+ data_map_{{idx.index_field.name}}.insert(x.{{format_property_name __code_style idx.index_field.name}}.clone(), x.clone());
+ {{~end~}}
+ }
+ {{~end~}}
+
+ Ok(std::sync::Arc::new({{table.name}} {
+ data_list,
+{{~if table.is_union_index~}}
+ data_map_union,
+{{~else if !table.index_list.empty?~}}
+ {{~for idx in table.index_list~}}
+ data_map_{{idx.index_field.name}},
+ {{~end~}}
+{{~end~}}
+ }))
+ }
+
+ {{~if table.is_union_index~}}
+ pub fn get(&self, key: &({{array.each table.index_list @index_type_name | array.join ', '}})) -> Option<{{value_type}}> {
+ self.data_map_union.get(key).map(|x| x.clone())
+ }
+ {{~else if !table.index_list.empty? ~}}
+ {{~for idx in table.index_list
+ index = format_property_name __code_style idx.index_field.name
+ ~}}
+ pub fn get_by_{{index}}(&self, key: &{{declaring_type_name idx.type}}) -> Option<{{value_type}}> {
+ self.data_map_{{index}}.get(key).map(|x| x.clone())
+ }
+ {{~end~}}
+ {{~end~}}
+}
+{{~else~}}
+
+impl {{name}} {
+ pub fn new(mut buf: ByteBuf) -> Result, LubanError> {
+ let n = buf.read_size();
+ if n != 1 { return Err(LubanError::Table(format!("table mode=one, but size != 1"))); }
+ {{deserialize 'data' 'buf' table.value_ttype}}
+ Ok(std::sync::Arc::new({{name}} { data }))
+ }
+}
+{{~end~}}
+
+{{~end~}}
diff --git a/Config/Tools/Luban/Templates/rust-bin/toml.sbn b/Config/Tools/Luban/Templates/rust-bin/toml.sbn
new file mode 100644
index 0000000..6345181
--- /dev/null
+++ b/Config/Tools/Luban/Templates/rust-bin/toml.sbn
@@ -0,0 +1,11 @@
+[package]
+name = "{{__name}}"
+version = "0.1.0"
+edition = "2021"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
+bitflags = { version = "2.5.x" , features = ["serde"] }
+macros = { path = "../macros" }
+luban_lib = { path = "../../luban_lib" }
\ No newline at end of file
diff --git a/Config/Tools/Luban/Templates/rust-json/lib.sbn b/Config/Tools/Luban/Templates/rust-json/lib.sbn
new file mode 100644
index 0000000..8f906cc
--- /dev/null
+++ b/Config/Tools/Luban/Templates/rust-json/lib.sbn
@@ -0,0 +1,51 @@
+pub mod prelude{
+ pub use crate::*;
+{{~ for ns in __ns ~}}
+ pub use {{ns}}::*;
+{{~end~}}
+}
+{{~ if __polymorphic_beans.count != 0 ~}}
+
+type AbstractBase = dyn std::any::Any + Sync + Send;
+
+pub trait GetBase<'a, T> {
+ fn get_base(&'a self) -> Result;
+}
+{{~end~}}
+
+#[derive(Debug)]
+pub enum LubanError {
+ Loader(String),
+ Table(String),
+ Bean(String),
+ Polymorphic(String),
+ Unknown(String),
+}
+
+impl std::fmt::Display for LubanError {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ f.write_str(match self {
+ LubanError::Loader(msg) |
+ LubanError::Table(msg) |
+ LubanError::Bean(msg) |
+ LubanError::Polymorphic(msg) |
+ LubanError::Unknown(msg) => msg,
+ })
+ }
+}
+
+pub struct Tables{
+{{~ for table in __tables ~}}
+ pub {{table.name}}: std::sync::Arc<{{full_name table}}>,
+{{~end~}}
+}
+
+impl Tables {
+ pub fn new Result>(loader: T) -> Result {
+ Ok(Tables {
+{{~ for table in __tables ~}}
+ {{table.name}}: {{full_name table}}::new(&loader("{{table.output_data_file}}")?)?,
+{{~end~}}
+ })
+ }
+}
\ No newline at end of file
diff --git a/Config/Tools/Luban/Templates/rust-json/mod.sbn b/Config/Tools/Luban/Templates/rust-json/mod.sbn
new file mode 100644
index 0000000..fc2f0be
--- /dev/null
+++ b/Config/Tools/Luban/Templates/rust-json/mod.sbn
@@ -0,0 +1,287 @@
+{{~ for mod in __mod.sub_mods ~}}
+pub mod {{mod.name}};
+{{~end~}}
+
+{{~ if __mod.name != '' ~}}
+use super::*;
+{{~end~}}
+use serde::Deserialize;
+
+{{~ for enum in __mod.enums ~}}
+{{~ if enum.comment != '' ~}}
+///{{enum.comment | html.escape}}
+{{~end~}}
+{{~ if enum.is_flags ~}}
+bitflags::bitflags!{
+ #[derive(Debug, Hash, Eq, PartialEq)]
+ pub struct {{enum.name}} : u32 {
+ {{~ for item in enum.items ~}}
+ {{~if item.comment_or_alias != '' ~}}
+ ///{{item.comment_or_alias | html.escape}}
+ {{~end~}}
+ const {{item.name}} = {{item.int_value}};
+ {{~end~}}
+ }
+}
+{{~else~}}
+#[derive(Deserialize, Debug, Hash, Eq, PartialEq, macros::EnumFromNum)]
+pub enum {{enum.name}} {
+ {{~ for item in enum.items ~}}
+{{~if item.comment_or_alias != '' ~}}
+ ///{{item.comment_or_alias | html.escape}}
+{{~end~}}
+ {{item.name}} = {{item.value}},
+ {{~end~}}
+ {{~if enum.items.empty?~}}
+ None
+ {{~end~}}
+}
+
+impl From for {{enum.name}} {
+ fn from(value: i32) -> Self {
+ match value {
+ {{~ for item in enum.items ~}}
+ {{item.value}} => {{enum.name}}::{{item.name}},
+ {{~end~}}
+ _ => panic!("Invalid value for {{enum.name}}:{}", value),
+ }
+ }
+}
+
+{{~end~}}
+{{~end~}}
+{{~ for bean in __mod.beans
+ hierarchy_fields = bean.hierarchy_export_fields
+~}}
+#[derive(Debug)]
+{{~if bean.parent != ''~}}
+#[derive(macros::TryIntoBase)]
+{{~end~}}
+pub struct {{bean.name}} {
+ {{~ for field in hierarchy_fields ~}}
+{{~if field.comment != '' ~}}
+ /// {{escape_comment field.comment}}
+{{~end~}}
+ pub {{field.name}}: {{declaring_type_name field.ctype}},
+ {{~end~}}
+}
+{{~if bean.is_abstract_type~}}
+
+impl {{bean.name}} {
+ pub fn new(json: &serde_json::Value) -> Result, LubanError> {
+ let type_id = json["$type"].as_str().unwrap();
+ match type_id {
+ {{~for child in bean.hierarchy_not_abstract_children~}}
+ "{{impl_data_type child bean}}" => Ok(std::sync::Arc::new({{full_name child}}::new(json)?)),
+ {{~end~}}
+ _ => Err(LubanError::Bean(format!("Invalid type for {{bean.name}}:{}", type_id)))
+ }
+ }
+}
+
+pub trait T{{bean.name}} {
+ {{~ for field in hierarchy_fields ~}}
+ fn {{getter_name field.name}}(&self) -> &{{declaring_type_name field.ctype}};
+ {{~end~}}
+}
+{{~for child in bean.hierarchy_not_abstract_children~}}
+
+impl {{base_trait_name bean}} for {{full_name child}} {
+ {{~ for field in hierarchy_fields ~}}
+ fn {{getter_name field.name}}(&self) -> &{{declaring_type_name field.ctype}} {
+ &self.{{field.name}}
+ }
+ {{~end~}}
+}
+{{~end~}}
+
+impl<'a> GetBase<'a, &'a dyn {{base_trait_name bean}}> for AbstractBase {
+ fn get_base(&'a self) -> Result<&'a dyn {{base_trait_name bean}}, LubanError> {
+ {{~for child in bean.hierarchy_not_abstract_children~}}
+ let base: Result<&{{full_name child}}, _> = self.try_into();
+ if let Ok(r) = base {
+ return Ok(r);
+ }
+ {{~end~}}
+
+ Err(LubanError::Polymorphic(format!("Invalid type for {{bean.name}}")))
+ }
+}
+{{~else~}}
+
+impl {{bean.name}}{
+ pub fn new(json: &serde_json::Value) -> Result<{{bean.name}}, LubanError> {
+ {{~ for field in hierarchy_fields ~}}
+ {{deserialize_field field.name 'json' field.ctype}}
+ {{~end~}}
+
+ Ok({{bean.name}} { {{ for field in hierarchy_fields }}{{field.name}}, {{end}}})
+ }
+}
+{{~end~}}
+
+{{~end~}}
+{{~ for table in __mod.tables
+ key_type = declaring_type_name table.key_ttype
+ if table.value_ttype.def_bean.is_abstract_type
+ value_type = declaring_type_name table.value_ttype
+ else
+ value_type = "std::sync::Arc<"+declaring_type_name table.value_ttype+">"
+ end
+ name = table.name
+ map_type = "std::collections::HashMap<"+key_type+", "+value_type+">"
+~}}
+{{
+
+ func index_type_name
+ ret (declaring_type_name $0.type)
+ end
+
+ func table_union_map_type_name
+ ret 'std::collections::HashMap<(' + (array.each table.index_list @index_type_name | array.join ', ') + '), ' + value_type + '>'
+ end
+
+ func table_key_list
+ varName = $0
+ indexList = table.index_list |array.each do; ret varName + '.' + (format_property_name __code_style $0.index_field.name); end;
+ ret array.join indexList ', '
+ end
+
+ func table_param_def_list
+ paramList = table.index_list |array.each do; ret (declaring_type_name $0.type) + ' ' + $0.index_field.name; end
+ ret array.join paramList ', '
+ end
+
+ func table_param_name_list
+ paramList = table.index_list |array.each do; ret $0.index_field.name; end
+ ret array.join paramList ', '
+ end
+}}
+{{~ if table.comment != '' ~}}
+///{{table.comment | html.escape}}
+{{~end~}}
+#[derive(Debug)]
+pub struct {{table.name}} {
+ {{~if table.is_map_table ~}}
+ pub data_list: Vec<{{value_type}}>,
+ pub data_map: {{map_type}},
+ {{~else if table.is_list_table ~}}
+ pub data_list: Vec<{{value_type}}>,
+ {{~if table.is_union_index~}}
+ pub data_map_union: {{table_union_map_type_name}},
+ {{~else if !table.index_list.empty?~}}
+ {{~for idx in table.index_list~}}
+ pub data_map_{{idx.index_field.name}}: std::collections::HashMap<{{declaring_type_name idx.type}}, {{value_type}}>,
+ {{~end~}}
+ {{~end~}}
+ {{~else~}}
+ pub data: {{declaring_type_name table.value_ttype}},
+ {{~end~}}
+}
+{{~if table.is_map_table ~}}
+
+impl {{name}} {
+ pub fn new(json: &serde_json::Value) -> Result, LubanError> {
+ let mut data_map: {{map_type}} = Default::default();
+ let mut data_list: Vec<{{value_type}}> = vec![];
+
+ for x in json.as_array().unwrap() {
+ {{~ if table.value_ttype.is_bean ~}}
+ {{deserialize_row "row" "x" table.value_ttype}}
+ {{~else~}}
+ let row: {{value_type}} = std::sync::Arc::new(serde_json::from_value(x.clone()).unwrap());
+ {{~end~}}
+ data_list.push(row.clone());
+ {{~ if table.value_ttype.def_bean.is_abstract_type ~}}
+ let key = >::get_base(std::ops::Deref::deref(&row))?;
+ data_map.insert(key.{{getter_name table.index_field.name}}().clone(), row.clone());
+ {{~else~}}
+ data_map.insert(row.{{table.index_field.name}}.clone(), row.clone());
+ {{~end~}}
+ }
+
+ Ok(std::sync::Arc::new({{name}} { data_map, data_list }))
+ }
+
+ pub fn get(&self, key: &{{key_type}}) -> Option<{{value_type}}> {
+ self.data_map.get(key).map(|x| x.clone())
+ }
+}
+
+impl std::ops::Index<{{key_type}}> for {{name}} {
+ type Output = {{value_type}};
+
+ fn index(&self, index: {{key_type}}) -> &Self::Output {
+ &self.data_map.get(&index).unwrap()
+ }
+}
+{{~else if table.is_list_table ~}}
+
+impl {{name}} {
+ pub fn new(json: &serde_json::Value) -> Result, LubanError> {
+ let mut data_list: Vec<{{value_type}}> = vec![];
+
+ for x in json.as_array().unwrap() {
+ {{~ if table.value_ttype.is_bean ~}}
+ {{deserialize_row "row" "x" table.value_ttype}}
+ {{~else~}}
+ let row: {{value_type}} = std::sync::Arc::new(serde_json::from_value(x.clone()).unwrap());
+ {{~end~}}
+ data_list.push(row.clone());
+ }
+ {{~if table.is_union_index~}}
+ let mut data_map_union: {{table_union_map_type_name}} = Default::default();
+ for x in &data_list {
+ data_map_union.insert(({{table_key_list "x"}}.clone()), x.clone());
+ }
+ {{~else if !table.index_list.empty?~}}
+ {{~for idx in table.index_list~}}
+ let mut data_map_{{idx.index_field.name}}: std::collections::HashMap<{{declaring_type_name idx.index_field.ctype}}, {{value_type}}> = Default::default();
+ {{~end~}}
+ for x in &data_list {
+ {{~for idx in table.index_list~}}
+ data_map_{{idx.index_field.name}}.insert(x.{{format_property_name __code_style idx.index_field.name}}.clone(), x.clone());
+ {{~end~}}
+ }
+ {{~end~}}
+
+ Ok(std::sync::Arc::new({{table.name}} {
+ data_list,
+{{~if table.is_union_index~}}
+ data_map_union,
+{{~else if !table.index_list.empty?~}}
+ {{~for idx in table.index_list~}}
+ data_map_{{idx.index_field.name}},
+ {{~end~}}
+{{~end~}}
+ }))
+ }
+
+ {{~if table.is_union_index~}}
+ pub fn get(&self, key: &({{array.each table.index_list @index_type_name | array.join ', '}})) -> Option<{{value_type}}> {
+ self.data_map_union.get(key).map(|x| x.clone())
+ }
+ {{~else if !table.index_list.empty? ~}}
+ {{~for idx in table.index_list
+ index = format_property_name __code_style idx.index_field.name
+ ~}}
+ pub fn get_by_{{index}}(&self, key: &{{declaring_type_name idx.type}}) -> Option<{{value_type}}> {
+ self.data_map_{{index}}.get(key).map(|x| x.clone())
+ }
+ {{~end~}}
+ {{~end~}}
+}
+{{~else~}}
+
+impl {{name}} {
+ pub fn new(json: &serde_json::Value) -> Result, LubanError> {
+ let json = json.as_array().unwrap();
+ let n = json.len();
+ if n != 1 { return Err(LubanError::Table(format!("table mode=one, but size != 1"))); }
+ let data = {{full_name table.value_ttype.def_bean}}::new(&json[0])?;
+ Ok(std::sync::Arc::new({{name}} { data }))
+ }
+}
+{{~end~}}
+
+{{~end~}}
diff --git a/Config/Tools/Luban/Templates/rust-json/toml.sbn b/Config/Tools/Luban/Templates/rust-json/toml.sbn
new file mode 100644
index 0000000..40870c7
--- /dev/null
+++ b/Config/Tools/Luban/Templates/rust-json/toml.sbn
@@ -0,0 +1,12 @@
+[package]
+name = "{{__name}}"
+version = "0.1.0"
+edition = "2021"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
+serde = { version = "1.0.x", features = ["derive"] }
+serde_json = "1.0.x"
+bitflags = { version = "2.5.x" , features = ["serde"]}
+macros = {path = "../macros"}
\ No newline at end of file
diff --git a/Config/Tools/Luban/Templates/typescript-bin/schema.sbn b/Config/Tools/Luban/Templates/typescript-bin/schema.sbn
new file mode 100644
index 0000000..254a33f
--- /dev/null
+++ b/Config/Tools/Luban/Templates/typescript-bin/schema.sbn
@@ -0,0 +1,234 @@
+
+import ByteBuf from '../luban/ByteBuf'
+
+{{~for enum in __enums~}}
+{{namespace_with_grace_begin enum.namespace}}
+{{~if enum.comment != '' ~}}
+/**
+ * {{enum.comment | html.escape}}
+ */
+{{~end~}}
+export enum {{enum.name}} {
+ {{~for item in enum.items ~}}
+{{~if item.comment != '' ~}}
+ /**
+ * {{escape_comment item.comment}}
+ */
+{{~end~}}
+ {{item.name}} = {{item.value}},
+ {{~end~}}
+}
+
+{{namespace_with_grace_end enum.namespace}}
+{{~end~}}
+
+
+{{~
+func get_ref_name
+ ret (format_property_name __code_style $0.name) + '_ref'
+end
+
+func generate_resolve_field_ref
+ field = $0
+ fieldName = format_property_name __code_style field.name
+ refTable = get_ref_table field
+ if can_generate_ref field
+ tableName = refTable.name
+ if field.is_nullable
+ ret 'this.'+(get_ref_name field) + ' = this.' + fieldName + '!= null ? tables.' + tableName + '.get(this.' + fieldName + ') : null'
+ else
+ ret 'this.'+(get_ref_name field) + ' = tables.' + tableName + '.get(this.' + fieldName + ')'
+ end
+ else
+ if (is_field_bean_need_resolve_ref field)
+ ret 'this.'+fieldName + '?.resolve(tables);'
+ else if (is_field_array_like_need_resolve_ref field)
+ ret 'for (let _e of ' + 'this.' + fieldName + ') { _e?.resolve(tables); }'
+ else if (is_field_map_need_resolve_ref field)
+ ret 'for (let [_, _e] of ' + 'this.' + fieldName + ') { _e?.resolve(tables); }'
+ else
+ ret ''
+ end
+ end
+end
+~}}
+
+{{~for bean in __beans~}}
+
+{{namespace_with_grace_begin bean.namespace}}
+{{~if bean.comment != '' ~}}
+/**
+ * {{escape_comment bean.comment}}
+ */
+{{~end~}}
+export {{if bean.is_abstract_type}}abstract {{end}}class {{bean.name}}{{if bean.parent_def_type}} extends {{bean.parent_def_type.full_name}}{{end}} {
+{{~if bean.is_abstract_type~}}
+ static constructorFrom(_buf_: ByteBuf): {{bean.name}}{
+ switch (_buf_.readInt()) {
+ {{~ for child in bean.hierarchy_not_abstract_children~}}
+ case {{child.id}}: return new {{child.full_name}}(_buf_)
+ {{~end~}}
+ default: throw new Error()
+ }
+ }
+{{~end~}}
+
+ constructor(_buf_: ByteBuf) {
+ {{~if bean.parent_def_type~}}
+ super(_buf_)
+ {{~end~}}
+ {{~ for field in bean.export_fields ~}}
+ {{deserialize ('this.' + format_field_name __code_style field.name) '_buf_' field.ctype}}
+ {{~end~}}
+ }
+
+ {{~ for field in bean.export_fields ~}}
+{{~if field.comment != '' ~}}
+ /**
+ * {{escape_comment field.comment}}
+ */
+{{~end~}}
+ readonly {{format_field_name __code_style field.name}}: {{declaring_type_name field.ctype}}
+ {{~if can_generate_ref field~}}
+ {{get_ref_name field}}: {{declaring_type_name (get_ref_type field)}} | undefined
+ {{~end~}}
+ {{~end~}}
+
+ resolve(tables:{{__name}}) {
+ {{~if bean.parent_def_type~}}
+ super.resolve(tables)
+ {{~end~}}
+ {{~ for field in bean.export_fields ~}}
+ {{generate_resolve_field_ref field}}
+ {{~end~}}
+ }
+}
+
+{{namespace_with_grace_end bean.namespace}}
+
+{{~end~}}
+
+{{~for table in __tables
+ key_type = table.key_ttype
+ value_type = table.value_ttype
+~}}
+
+{{namespace_with_grace_begin table.namespace}}
+{{~if table.comment != '' ~}}
+/**
+ * {{escape_comment table.comment}}
+ */
+{{~end~}}
+export class {{table.name}} {
+ {{~if table.is_map_table ~}}
+ private _dataMap: Map<{{declaring_type_name key_type}}, {{declaring_type_name value_type}}>
+ private _dataList: {{declaring_type_name value_type}}[]
+ constructor(_buf_: ByteBuf) {
+ this._dataMap = new Map<{{declaring_type_name key_type}}, {{declaring_type_name value_type}}>()
+ this._dataList = []
+ for(let n = _buf_.readInt(); n > 0; n--) {
+ let _v: {{declaring_type_name value_type}}
+ {{deserialize '_v' '_buf_' value_type}}
+ this._dataList.push(_v)
+ this._dataMap.set(_v.{{format_field_name __code_style table.index_field.name}}, _v)
+ }
+ }
+
+ getDataMap(): Map<{{declaring_type_name key_type}}, {{declaring_type_name value_type}}> { return this._dataMap; }
+ getDataList(): {{declaring_type_name value_type}}[] { return this._dataList; }
+
+ get(key: {{declaring_type_name key_type}}): {{declaring_type_name value_type}} | undefined {
+ return this._dataMap.get(key);
+ }
+
+ resolve(tables:{{__name}}) {
+ for(let data of this._dataList)
+ {
+ data.resolve(tables)
+ }
+ }
+ {{~else if table.is_list_table ~}}
+ private _dataList: {{declaring_type_name value_type}}[]
+
+ constructor(_buf_: ByteBuf) {
+ this._dataList = []
+ for(let n = _buf_.readInt(); n > 0; n--) {
+ let _v: {{declaring_type_name value_type}}
+ {{deserialize '_v' '_buf_' value_type}}
+ this._dataList.push(_v)
+ }
+ }
+
+ getDataList(): {{declaring_type_name value_type}}[] { return this._dataList }
+
+ get(index: number): {{declaring_type_name value_type}} | undefined { return this._dataList[index] }
+
+ resolve(tables:{{__name}}) {
+ for(let data of this._dataList)
+ {
+ data.resolve(tables)
+ }
+ }
+ {{~else~}}
+
+ private _data: {{declaring_type_name value_type}}
+ constructor(_buf_: ByteBuf) {
+ if (_buf_.readInt() != 1) throw new Error('table mode=one, but size != 1')
+ {{deserialize 'this._data' '_buf_' value_type}}
+ }
+
+ getData(): {{declaring_type_name value_type}} { return this._data; }
+
+ {{~ for field in value_type.def_bean.hierarchy_export_fields ~}}
+{{~if field.comment != '' ~}}
+ /**
+ * {{escape_comment field.comment}}
+ */
+{{~end~}}
+ get {{format_field_name __code_style field.name}}(): {{declaring_type_name field.ctype}} { return this._data.{{format_field_name __code_style field.name}}; }
+ {{~if can_generate_ref field~}}
+ get {{format_field_name __code_style field.name}}_ref(): {{declaring_type_name (get_ref_type field)}} | undefined { return this._data.{{format_field_name __code_style field.name}}_ref; }
+ {{~end~}}
+ {{~end~}}
+
+ resolve(tables:{{__name}}) {
+ this._data.resolve(tables)
+ }
+ {{end}}
+}
+{{namespace_with_grace_end table.namespace}}
+
+{{~end~}}
+
+
+type ByteBufLoader = (file: string) => ByteBuf
+
+export class {{__name}} {
+ {{~ for table in __tables ~}}
+ private _{{table.name}}: {{table.full_name}}
+{{~if table.comment != '' ~}}
+ /**
+ * {{escape_comment table.comment}}
+ */
+{{~end~}}
+ get {{table.name}}(): {{table.full_name}} { return this._{{table.name}};}
+ {{~end~}}
+
+ static getTableNames(): string[] {
+ let names: string[] = [];
+ {{~for table in __tables ~}}
+ names.push('{{table.output_data_file}}');
+ {{~end~}}
+ return names;
+ }
+
+ constructor(loader: ByteBufLoader) {
+ {{~for table in __tables ~}}
+ this._{{table.name}} = new {{table.full_name}}(loader('{{table.output_data_file}}'))
+ {{~end~}}
+
+ {{~for table in __tables ~}}
+ this._{{table.name}}.resolve(this)
+ {{~end~}}
+ }
+}
diff --git a/Config/Tools/Luban/Templates/typescript-json/schema.sbn b/Config/Tools/Luban/Templates/typescript-json/schema.sbn
new file mode 100644
index 0000000..ed79422
--- /dev/null
+++ b/Config/Tools/Luban/Templates/typescript-json/schema.sbn
@@ -0,0 +1,226 @@
+
+{{~for enum in __enums~}}
+{{namespace_with_grace_begin enum.namespace}}
+{{~if enum.comment != '' ~}}
+/**
+ * {{enum.comment | html.escape}}
+ */
+{{~end~}}
+export enum {{enum.name}} {
+ {{~for item in enum.items ~}}
+{{~if item.comment != '' ~}}
+ /**
+ * {{escape_comment item.comment}}
+ */
+{{~end~}}
+ {{item.name}} = {{item.value}},
+ {{~end~}}
+}
+
+{{namespace_with_grace_end enum.namespace}}
+{{~end~}}
+
+
+{{~
+func get_ref_name
+ ret (format_property_name __code_style $0.name) + '_ref'
+end
+
+func generate_resolve_field_ref
+ field = $0
+ fieldName = format_property_name __code_style field.name
+ refTable = get_ref_table field
+ if can_generate_ref field
+ tableName = refTable.name
+ if field.is_nullable
+ ret 'this.'+(get_ref_name field) + ' = this.' + fieldName + '!= null ? tables.' + tableName + '.get(this.' + fieldName + ') : null'
+ else
+ ret 'this.'+(get_ref_name field) + ' = tables.' + tableName + '.get(this.' + fieldName + ')'
+ end
+ else
+ if (is_field_bean_need_resolve_ref field)
+ ret 'this.'+fieldName + '?.resolve(tables);'
+ else if (is_field_array_like_need_resolve_ref field)
+ ret 'for (let _e of ' + 'this.' + fieldName + ') { _e?.resolve(tables); }'
+ else if (is_field_map_need_resolve_ref field)
+ ret 'for (let [_, _e] of ' + 'this.' + fieldName + ') { _e?.resolve(tables); }'
+ else
+ ret ''
+ end
+ end
+end
+~}}
+
+{{~for bean in __beans~}}
+
+{{namespace_with_grace_begin bean.namespace}}
+{{~if bean.comment != '' ~}}
+/**
+ * {{escape_comment bean.comment}}
+ */
+{{~end~}}
+export {{if bean.is_abstract_type}}abstract {{end}}class {{bean.name}}{{if bean.parent_def_type}} extends {{bean.parent_def_type.full_name}}{{end}} {
+{{~if bean.is_abstract_type~}}
+ static constructorFrom(_json_: any): {{bean.name}}{
+ switch (_json_["$type"]) {
+ {{~ for child in bean.hierarchy_not_abstract_children~}}
+ case '{{impl_data_type child bean}}': return new {{child.full_name}}(_json_)
+ {{~end~}}
+ default: throw new Error()
+ }
+ }
+{{~end~}}
+
+ constructor(_json_: any) {
+ {{~if bean.parent_def_type~}}
+ super(_json_)
+ {{~end~}}
+ {{~ for field in bean.export_fields ~}}
+ {{~if !field.ctype.is_nullable~}}
+ if (_json_.{{field.name}} === undefined) { throw new Error() }
+ {{~end~}}
+ {{deserialize ('this.' + format_field_name __code_style field.name) ( '_json_.' + field.name) field.ctype}}
+ {{~end~}}
+ }
+
+ {{~ for field in bean.export_fields ~}}
+{{~if field.comment != '' ~}}
+ /**
+ * {{escape_comment field.comment}}
+ */
+{{~end~}}
+ readonly {{format_field_name __code_style field.name}}: {{declaring_type_name field.ctype}}
+ {{~if can_generate_ref field~}}
+ {{get_ref_name field}}: {{declaring_type_name (get_ref_type field)}} | undefined
+ {{~end~}}
+ {{~end~}}
+
+ resolve(tables:{{__name}}) {
+ {{~if bean.parent_def_type~}}
+ super.resolve(tables)
+ {{~end~}}
+ {{~ for field in bean.export_fields ~}}
+ {{generate_resolve_field_ref field}}
+ {{~end~}}
+ }
+}
+
+{{namespace_with_grace_end bean.namespace}}
+
+{{~end~}}
+
+{{~for table in __tables
+ key_type = table.key_ttype
+ value_type = table.value_ttype
+~}}
+
+{{namespace_with_grace_begin table.namespace}}
+{{~if table.comment != '' ~}}
+/**
+ * {{escape_comment table.comment}}
+ */
+{{~end~}}
+export class {{table.name}} {
+ {{~if table.is_map_table ~}}
+ private _dataMap: Map<{{declaring_type_name key_type}}, {{declaring_type_name value_type}}>
+ private _dataList: {{declaring_type_name value_type}}[]
+ constructor(_json_: any) {
+ this._dataMap = new Map<{{declaring_type_name key_type}}, {{declaring_type_name value_type}}>()
+ this._dataList = []
+ for(var _json2_ of _json_) {
+ let _v: {{declaring_type_name value_type}}
+ {{deserialize '_v' '_json2_' value_type}}
+ this._dataList.push(_v)
+ this._dataMap.set(_v.{{format_field_name __code_style table.index_field.name}}, _v)
+ }
+ }
+
+ getDataMap(): Map<{{declaring_type_name key_type}}, {{declaring_type_name value_type}}> { return this._dataMap; }
+ getDataList(): {{declaring_type_name value_type}}[] { return this._dataList; }
+
+ get(key: {{declaring_type_name key_type}}): {{declaring_type_name value_type}} | undefined { return this._dataMap.get(key); }
+
+ resolve(tables:{{__name}}) {
+ for(let data of this._dataList)
+ {
+ data.resolve(tables)
+ }
+ }
+ {{~else if table.is_list_table ~}}
+ private _dataList: {{declaring_type_name value_type}}[]
+
+ constructor(_json_: any) {
+ this._dataList = []
+ for(var _json2_ of _json_) {
+ let _v: {{declaring_type_name value_type}}
+ {{deserialize '_v' '_json2_' value_type}}
+ this._dataList.push(_v)
+ }
+ }
+
+ getDataList(): {{declaring_type_name value_type}}[] { return this._dataList }
+
+ get(index: number): {{declaring_type_name value_type}} | undefined { return this._dataList[index] }
+
+ resolve(tables:{{__name}}) {
+ for(let data of this._dataList)
+ {
+ data.resolve(tables)
+ }
+ }
+ {{~else~}}
+
+ private _data: {{declaring_type_name value_type}}
+ constructor(_json_: any) {
+ if (_json_.length != 1) throw new Error('table mode=one, but size != 1')
+ {{deserialize 'this._data' '_json_[0]' value_type}}
+ }
+
+ getData(): {{declaring_type_name value_type}} { return this._data; }
+
+ {{~ for field in value_type.def_bean.hierarchy_export_fields ~}}
+{{~if field.comment != '' ~}}
+ /**
+ * {{escape_comment field.comment}}
+ */
+{{~end~}}
+ get {{format_field_name __code_style field.name}}(): {{declaring_type_name field.ctype}} { return this._data.{{format_field_name __code_style field.name}}; }
+ {{~if can_generate_ref field~}}
+ get {{format_field_name __code_style field.name}}_ref(): {{declaring_type_name (get_ref_type field)}} | undefined { return this._data.{{format_field_name __code_style field.name}}_ref; }
+ {{~end~}}
+ {{~end~}}
+
+ resolve(tables:{{__name}})
+ {
+ this._data.resolve(tables)
+ }
+ {{end}}
+}
+{{namespace_with_grace_end table.namespace}}
+
+{{~end~}}
+
+
+type JsonLoader = (file: string) => any
+
+export class {{__name}} {
+ {{~ for table in __tables ~}}
+ private _{{table.name}}: {{table.full_name}}
+{{~if table.comment != '' ~}}
+ /**
+ * {{escape_comment table.comment}}
+ */
+{{~end~}}
+ get {{table.name}}(): {{table.full_name}} { return this._{{table.name}};}
+ {{~end~}}
+
+ constructor(loader: JsonLoader) {
+ {{~for table in __tables ~}}
+ this._{{table.name}} = new {{table.full_name}}(loader('{{table.output_data_file}}'))
+ {{~end~}}
+
+ {{~for table in __tables ~}}
+ this._{{table.name}}.resolve(this)
+ {{~end~}}
+ }
+}
diff --git a/Config/Tools/Luban/Templates/typescript-protobuf/schema.sbn b/Config/Tools/Luban/Templates/typescript-protobuf/schema.sbn
new file mode 100644
index 0000000..0538d7b
--- /dev/null
+++ b/Config/Tools/Luban/Templates/typescript-protobuf/schema.sbn
@@ -0,0 +1,31 @@
+import pb from 'pb';
+
+type BufLoader = (file: string) => Uint8Array;
+
+export class {{__name}} {
+ {{~ for table in __tables ~}}
+ private _{{table.name}}: pb.cfg.{{table.name}}
+{{~if table.comment != '' ~}}
+ /**
+ * {{escape_comment table.comment}}
+ */
+{{~end~}}
+ get {{table.name}}(): pb.cfg.{{table.name}} { return this._{{table.name}};}
+ {{~end~}}
+
+ static getTableNames(): string[] {
+ let names: string[] = [];
+ {{~for table in __tables ~}}
+ names.push('{{table.output_data_file}}');
+ {{~end~}}
+ return names;
+ }
+
+ constructor(loader: BufLoader) {
+ let buffer: Uint8Array;
+ {{~for table in __tables ~}}
+ buffer = loader('{{table.output_data_file}}');
+ this._{{table.name}} = pb.cfg.{{table.name}}.decode(buffer, buffer.length);
+ {{~end~}}
+ }
+}
diff --git a/Config/Tools/Luban/Ude.NetStandard.dll b/Config/Tools/Luban/Ude.NetStandard.dll
new file mode 100644
index 0000000..2cb9b2f
Binary files /dev/null and b/Config/Tools/Luban/Ude.NetStandard.dll differ
diff --git a/Config/Tools/Luban/YamlDotNet.NetCore.dll b/Config/Tools/Luban/YamlDotNet.NetCore.dll
new file mode 100644
index 0000000..1c598d7
Binary files /dev/null and b/Config/Tools/Luban/YamlDotNet.NetCore.dll differ
diff --git a/Config/Tools/Luban/de/Neo.Lua.resources.dll b/Config/Tools/Luban/de/Neo.Lua.resources.dll
new file mode 100644
index 0000000..69bb385
Binary files /dev/null and b/Config/Tools/Luban/de/Neo.Lua.resources.dll differ
diff --git a/Config/Tools/Luban/nlog.xml b/Config/Tools/Luban/nlog.xml
new file mode 100644
index 0000000..8c390bc
--- /dev/null
+++ b/Config/Tools/Luban/nlog.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Config/Tools/build-luban.bat b/Config/Tools/build-luban.bat
new file mode 100644
index 0000000..3b26f43
--- /dev/null
+++ b/Config/Tools/build-luban.bat
@@ -0,0 +1,5 @@
+rd /s /q Luban
+
+dotnet build ../../luban/src/Luban/Luban.csproj -c Release -o Luban
+
+pause
\ No newline at end of file
diff --git a/Config/Tools/build-luban.sh b/Config/Tools/build-luban.sh
new file mode 100644
index 0000000..c09a728
--- /dev/null
+++ b/Config/Tools/build-luban.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+
+[ -d Luban ] && rm -rf Luban
+
+dotnet build ../../luban/src/Luban/Luban.csproj -c Release -o Luban
\ No newline at end of file
diff --git a/Config/Tools/protoc/bin/protoc.exe b/Config/Tools/protoc/bin/protoc.exe
new file mode 100644
index 0000000..607e784
Binary files /dev/null and b/Config/Tools/protoc/bin/protoc.exe differ
diff --git a/Config/Tools/protoc/include/google/protobuf/any.proto b/Config/Tools/protoc/include/google/protobuf/any.proto
new file mode 100644
index 0000000..eff44e5
--- /dev/null
+++ b/Config/Tools/protoc/include/google/protobuf/any.proto
@@ -0,0 +1,162 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+syntax = "proto3";
+
+package google.protobuf;
+
+option go_package = "google.golang.org/protobuf/types/known/anypb";
+option java_package = "com.google.protobuf";
+option java_outer_classname = "AnyProto";
+option java_multiple_files = true;
+option objc_class_prefix = "GPB";
+option csharp_namespace = "Google.Protobuf.WellKnownTypes";
+
+// `Any` contains an arbitrary serialized protocol buffer message along with a
+// URL that describes the type of the serialized message.
+//
+// Protobuf library provides support to pack/unpack Any values in the form
+// of utility functions or additional generated methods of the Any type.
+//
+// Example 1: Pack and unpack a message in C++.
+//
+// Foo foo = ...;
+// Any any;
+// any.PackFrom(foo);
+// ...
+// if (any.UnpackTo(&foo)) {
+// ...
+// }
+//
+// Example 2: Pack and unpack a message in Java.
+//
+// Foo foo = ...;
+// Any any = Any.pack(foo);
+// ...
+// if (any.is(Foo.class)) {
+// foo = any.unpack(Foo.class);
+// }
+// // or ...
+// if (any.isSameTypeAs(Foo.getDefaultInstance())) {
+// foo = any.unpack(Foo.getDefaultInstance());
+// }
+//
+// Example 3: Pack and unpack a message in Python.
+//
+// foo = Foo(...)
+// any = Any()
+// any.Pack(foo)
+// ...
+// if any.Is(Foo.DESCRIPTOR):
+// any.Unpack(foo)
+// ...
+//
+// Example 4: Pack and unpack a message in Go
+//
+// foo := &pb.Foo{...}
+// any, err := anypb.New(foo)
+// if err != nil {
+// ...
+// }
+// ...
+// foo := &pb.Foo{}
+// if err := any.UnmarshalTo(foo); err != nil {
+// ...
+// }
+//
+// The pack methods provided by protobuf library will by default use
+// 'type.googleapis.com/full.type.name' as the type URL and the unpack
+// methods only use the fully qualified type name after the last '/'
+// in the type URL, for example "foo.bar.com/x/y.z" will yield type
+// name "y.z".
+//
+// JSON
+// ====
+// The JSON representation of an `Any` value uses the regular
+// representation of the deserialized, embedded message, with an
+// additional field `@type` which contains the type URL. Example:
+//
+// package google.profile;
+// message Person {
+// string first_name = 1;
+// string last_name = 2;
+// }
+//
+// {
+// "@type": "type.googleapis.com/google.profile.Person",
+// "firstName": ,
+// "lastName":
+// }
+//
+// If the embedded message type is well-known and has a custom JSON
+// representation, that representation will be embedded adding a field
+// `value` which holds the custom JSON in addition to the `@type`
+// field. Example (for message [google.protobuf.Duration][]):
+//
+// {
+// "@type": "type.googleapis.com/google.protobuf.Duration",
+// "value": "1.212s"
+// }
+//
+message Any {
+ // A URL/resource name that uniquely identifies the type of the serialized
+ // protocol buffer message. This string must contain at least
+ // one "/" character. The last segment of the URL's path must represent
+ // the fully qualified name of the type (as in
+ // `path/google.protobuf.Duration`). The name should be in a canonical form
+ // (e.g., leading "." is not accepted).
+ //
+ // In practice, teams usually precompile into the binary all types that they
+ // expect it to use in the context of Any. However, for URLs which use the
+ // scheme `http`, `https`, or no scheme, one can optionally set up a type
+ // server that maps type URLs to message definitions as follows:
+ //
+ // * If no scheme is provided, `https` is assumed.
+ // * An HTTP GET on the URL must yield a [google.protobuf.Type][]
+ // value in binary format, or produce an error.
+ // * Applications are allowed to cache lookup results based on the
+ // URL, or have them precompiled into a binary to avoid any
+ // lookup. Therefore, binary compatibility needs to be preserved
+ // on changes to types. (Use versioned type names to manage
+ // breaking changes.)
+ //
+ // Note: this functionality is not currently available in the official
+ // protobuf release, and it is not used for type URLs beginning with
+ // type.googleapis.com. As of May 2023, there are no widely used type server
+ // implementations and no plans to implement one.
+ //
+ // Schemes other than `http`, `https` (or the empty scheme) might be
+ // used with implementation specific semantics.
+ //
+ string type_url = 1;
+
+ // Must be a valid serialized protocol buffer of the above specified type.
+ bytes value = 2;
+}
diff --git a/Config/Tools/protoc/include/google/protobuf/api.proto b/Config/Tools/protoc/include/google/protobuf/api.proto
new file mode 100644
index 0000000..4222351
--- /dev/null
+++ b/Config/Tools/protoc/include/google/protobuf/api.proto
@@ -0,0 +1,207 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+syntax = "proto3";
+
+package google.protobuf;
+
+import "google/protobuf/source_context.proto";
+import "google/protobuf/type.proto";
+
+option java_package = "com.google.protobuf";
+option java_outer_classname = "ApiProto";
+option java_multiple_files = true;
+option objc_class_prefix = "GPB";
+option csharp_namespace = "Google.Protobuf.WellKnownTypes";
+option go_package = "google.golang.org/protobuf/types/known/apipb";
+
+// Api is a light-weight descriptor for an API Interface.
+//
+// Interfaces are also described as "protocol buffer services" in some contexts,
+// such as by the "service" keyword in a .proto file, but they are different
+// from API Services, which represent a concrete implementation of an interface
+// as opposed to simply a description of methods and bindings. They are also
+// sometimes simply referred to as "APIs" in other contexts, such as the name of
+// this message itself. See https://cloud.google.com/apis/design/glossary for
+// detailed terminology.
+message Api {
+ // The fully qualified name of this interface, including package name
+ // followed by the interface's simple name.
+ string name = 1;
+
+ // The methods of this interface, in unspecified order.
+ repeated Method methods = 2;
+
+ // Any metadata attached to the interface.
+ repeated Option options = 3;
+
+ // A version string for this interface. If specified, must have the form
+ // `major-version.minor-version`, as in `1.10`. If the minor version is
+ // omitted, it defaults to zero. If the entire version field is empty, the
+ // major version is derived from the package name, as outlined below. If the
+ // field is not empty, the version in the package name will be verified to be
+ // consistent with what is provided here.
+ //
+ // The versioning schema uses [semantic
+ // versioning](http://semver.org) where the major version number
+ // indicates a breaking change and the minor version an additive,
+ // non-breaking change. Both version numbers are signals to users
+ // what to expect from different versions, and should be carefully
+ // chosen based on the product plan.
+ //
+ // The major version is also reflected in the package name of the
+ // interface, which must end in `v`, as in
+ // `google.feature.v1`. For major versions 0 and 1, the suffix can
+ // be omitted. Zero major versions must only be used for
+ // experimental, non-GA interfaces.
+ //
+ string version = 4;
+
+ // Source context for the protocol buffer service represented by this
+ // message.
+ SourceContext source_context = 5;
+
+ // Included interfaces. See [Mixin][].
+ repeated Mixin mixins = 6;
+
+ // The source syntax of the service.
+ Syntax syntax = 7;
+}
+
+// Method represents a method of an API interface.
+message Method {
+ // The simple name of this method.
+ string name = 1;
+
+ // A URL of the input message type.
+ string request_type_url = 2;
+
+ // If true, the request is streamed.
+ bool request_streaming = 3;
+
+ // The URL of the output message type.
+ string response_type_url = 4;
+
+ // If true, the response is streamed.
+ bool response_streaming = 5;
+
+ // Any metadata attached to the method.
+ repeated Option options = 6;
+
+ // The source syntax of this method.
+ Syntax syntax = 7;
+}
+
+// Declares an API Interface to be included in this interface. The including
+// interface must redeclare all the methods from the included interface, but
+// documentation and options are inherited as follows:
+//
+// - If after comment and whitespace stripping, the documentation
+// string of the redeclared method is empty, it will be inherited
+// from the original method.
+//
+// - Each annotation belonging to the service config (http,
+// visibility) which is not set in the redeclared method will be
+// inherited.
+//
+// - If an http annotation is inherited, the path pattern will be
+// modified as follows. Any version prefix will be replaced by the
+// version of the including interface plus the [root][] path if
+// specified.
+//
+// Example of a simple mixin:
+//
+// package google.acl.v1;
+// service AccessControl {
+// // Get the underlying ACL object.
+// rpc GetAcl(GetAclRequest) returns (Acl) {
+// option (google.api.http).get = "/v1/{resource=**}:getAcl";
+// }
+// }
+//
+// package google.storage.v2;
+// service Storage {
+// rpc GetAcl(GetAclRequest) returns (Acl);
+//
+// // Get a data record.
+// rpc GetData(GetDataRequest) returns (Data) {
+// option (google.api.http).get = "/v2/{resource=**}";
+// }
+// }
+//
+// Example of a mixin configuration:
+//
+// apis:
+// - name: google.storage.v2.Storage
+// mixins:
+// - name: google.acl.v1.AccessControl
+//
+// The mixin construct implies that all methods in `AccessControl` are
+// also declared with same name and request/response types in
+// `Storage`. A documentation generator or annotation processor will
+// see the effective `Storage.GetAcl` method after inherting
+// documentation and annotations as follows:
+//
+// service Storage {
+// // Get the underlying ACL object.
+// rpc GetAcl(GetAclRequest) returns (Acl) {
+// option (google.api.http).get = "/v2/{resource=**}:getAcl";
+// }
+// ...
+// }
+//
+// Note how the version in the path pattern changed from `v1` to `v2`.
+//
+// If the `root` field in the mixin is specified, it should be a
+// relative path under which inherited HTTP paths are placed. Example:
+//
+// apis:
+// - name: google.storage.v2.Storage
+// mixins:
+// - name: google.acl.v1.AccessControl
+// root: acls
+//
+// This implies the following inherited HTTP annotation:
+//
+// service Storage {
+// // Get the underlying ACL object.
+// rpc GetAcl(GetAclRequest) returns (Acl) {
+// option (google.api.http).get = "/v2/acls/{resource=**}:getAcl";
+// }
+// ...
+// }
+message Mixin {
+ // The fully qualified name of the interface which is included.
+ string name = 1;
+
+ // If non-empty specifies a path under which inherited HTTP paths
+ // are rooted.
+ string root = 2;
+}
diff --git a/Config/Tools/protoc/include/google/protobuf/compiler/plugin.proto b/Config/Tools/protoc/include/google/protobuf/compiler/plugin.proto
new file mode 100644
index 0000000..1a80986
--- /dev/null
+++ b/Config/Tools/protoc/include/google/protobuf/compiler/plugin.proto
@@ -0,0 +1,191 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Author: kenton@google.com (Kenton Varda)
+//
+// protoc (aka the Protocol Compiler) can be extended via plugins. A plugin is
+// just a program that reads a CodeGeneratorRequest from stdin and writes a
+// CodeGeneratorResponse to stdout.
+//
+// Plugins written using C++ can use google/protobuf/compiler/plugin.h instead
+// of dealing with the raw protocol defined here.
+//
+// A plugin executable needs only to be placed somewhere in the path. The
+// plugin should be named "protoc-gen-$NAME", and will then be used when the
+// flag "--${NAME}_out" is passed to protoc.
+
+syntax = "proto2";
+
+package google.protobuf.compiler;
+option java_package = "com.google.protobuf.compiler";
+option java_outer_classname = "PluginProtos";
+
+option csharp_namespace = "Google.Protobuf.Compiler";
+option go_package = "google.golang.org/protobuf/types/pluginpb";
+
+import "google/protobuf/descriptor.proto";
+
+// The version number of protocol compiler.
+message Version {
+ optional int32 major = 1;
+ optional int32 minor = 2;
+ optional int32 patch = 3;
+ // A suffix for alpha, beta or rc release, e.g., "alpha-1", "rc2". It should
+ // be empty for mainline stable releases.
+ optional string suffix = 4;
+}
+
+// An encoded CodeGeneratorRequest is written to the plugin's stdin.
+message CodeGeneratorRequest {
+ // The .proto files that were explicitly listed on the command-line. The
+ // code generator should generate code only for these files. Each file's
+ // descriptor will be included in proto_file, below.
+ repeated string file_to_generate = 1;
+
+ // The generator parameter passed on the command-line.
+ optional string parameter = 2;
+
+ // FileDescriptorProtos for all files in files_to_generate and everything
+ // they import. The files will appear in topological order, so each file
+ // appears before any file that imports it.
+ //
+ // Note: the files listed in files_to_generate will include runtime-retention
+ // options only, but all other files will include source-retention options.
+ // The source_file_descriptors field below is available in case you need
+ // source-retention options for files_to_generate.
+ //
+ // protoc guarantees that all proto_files will be written after
+ // the fields above, even though this is not technically guaranteed by the
+ // protobuf wire format. This theoretically could allow a plugin to stream
+ // in the FileDescriptorProtos and handle them one by one rather than read
+ // the entire set into memory at once. However, as of this writing, this
+ // is not similarly optimized on protoc's end -- it will store all fields in
+ // memory at once before sending them to the plugin.
+ //
+ // Type names of fields and extensions in the FileDescriptorProto are always
+ // fully qualified.
+ repeated FileDescriptorProto proto_file = 15;
+
+ // File descriptors with all options, including source-retention options.
+ // These descriptors are only provided for the files listed in
+ // files_to_generate.
+ repeated FileDescriptorProto source_file_descriptors = 17;
+
+ // The version number of protocol compiler.
+ optional Version compiler_version = 3;
+}
+
+// The plugin writes an encoded CodeGeneratorResponse to stdout.
+message CodeGeneratorResponse {
+ // Error message. If non-empty, code generation failed. The plugin process
+ // should exit with status code zero even if it reports an error in this way.
+ //
+ // This should be used to indicate errors in .proto files which prevent the
+ // code generator from generating correct code. Errors which indicate a
+ // problem in protoc itself -- such as the input CodeGeneratorRequest being
+ // unparseable -- should be reported by writing a message to stderr and
+ // exiting with a non-zero status code.
+ optional string error = 1;
+
+ // A bitmask of supported features that the code generator supports.
+ // This is a bitwise "or" of values from the Feature enum.
+ optional uint64 supported_features = 2;
+
+ // Sync with code_generator.h.
+ enum Feature {
+ FEATURE_NONE = 0;
+ FEATURE_PROTO3_OPTIONAL = 1;
+ FEATURE_SUPPORTS_EDITIONS = 2;
+ }
+
+ // Represents a single generated file.
+ message File {
+ // The file name, relative to the output directory. The name must not
+ // contain "." or ".." components and must be relative, not be absolute (so,
+ // the file cannot lie outside the output directory). "/" must be used as
+ // the path separator, not "\".
+ //
+ // If the name is omitted, the content will be appended to the previous
+ // file. This allows the generator to break large files into small chunks,
+ // and allows the generated text to be streamed back to protoc so that large
+ // files need not reside completely in memory at one time. Note that as of
+ // this writing protoc does not optimize for this -- it will read the entire
+ // CodeGeneratorResponse before writing files to disk.
+ optional string name = 1;
+
+ // If non-empty, indicates that the named file should already exist, and the
+ // content here is to be inserted into that file at a defined insertion
+ // point. This feature allows a code generator to extend the output
+ // produced by another code generator. The original generator may provide
+ // insertion points by placing special annotations in the file that look
+ // like:
+ // @@protoc_insertion_point(NAME)
+ // The annotation can have arbitrary text before and after it on the line,
+ // which allows it to be placed in a comment. NAME should be replaced with
+ // an identifier naming the point -- this is what other generators will use
+ // as the insertion_point. Code inserted at this point will be placed
+ // immediately above the line containing the insertion point (thus multiple
+ // insertions to the same point will come out in the order they were added).
+ // The double-@ is intended to make it unlikely that the generated code
+ // could contain things that look like insertion points by accident.
+ //
+ // For example, the C++ code generator places the following line in the
+ // .pb.h files that it generates:
+ // // @@protoc_insertion_point(namespace_scope)
+ // This line appears within the scope of the file's package namespace, but
+ // outside of any particular class. Another plugin can then specify the
+ // insertion_point "namespace_scope" to generate additional classes or
+ // other declarations that should be placed in this scope.
+ //
+ // Note that if the line containing the insertion point begins with
+ // whitespace, the same whitespace will be added to every line of the
+ // inserted text. This is useful for languages like Python, where
+ // indentation matters. In these languages, the insertion point comment
+ // should be indented the same amount as any inserted code will need to be
+ // in order to work correctly in that context.
+ //
+ // The code generator that generates the initial file and the one which
+ // inserts into it must both run as part of a single invocation of protoc.
+ // Code generators are executed in the order in which they appear on the
+ // command line.
+ //
+ // If |insertion_point| is present, |name| must also be present.
+ optional string insertion_point = 2;
+
+ // The file contents.
+ optional string content = 15;
+
+ // Information describing the file content being inserted. If an insertion
+ // point is used, this information will be appropriately offset and inserted
+ // into the code generation metadata for the generated files.
+ optional GeneratedCodeInfo generated_code_info = 16;
+ }
+ repeated File file = 15;
+}
diff --git a/Config/Tools/protoc/include/google/protobuf/descriptor.proto b/Config/Tools/protoc/include/google/protobuf/descriptor.proto
new file mode 100644
index 0000000..5f14822
--- /dev/null
+++ b/Config/Tools/protoc/include/google/protobuf/descriptor.proto
@@ -0,0 +1,1157 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Author: kenton@google.com (Kenton Varda)
+// Based on original Protocol Buffers design by
+// Sanjay Ghemawat, Jeff Dean, and others.
+//
+// The messages in this file describe the definitions found in .proto files.
+// A valid .proto file can be translated directly to a FileDescriptorProto
+// without any other information (e.g. without reading its imports).
+
+syntax = "proto2";
+
+package google.protobuf;
+
+option go_package = "google.golang.org/protobuf/types/descriptorpb";
+option java_package = "com.google.protobuf";
+option java_outer_classname = "DescriptorProtos";
+option csharp_namespace = "Google.Protobuf.Reflection";
+option objc_class_prefix = "GPB";
+option cc_enable_arenas = true;
+
+// descriptor.proto must be optimized for speed because reflection-based
+// algorithms don't work during bootstrapping.
+option optimize_for = SPEED;
+
+// The protocol compiler can output a FileDescriptorSet containing the .proto
+// files it parses.
+message FileDescriptorSet {
+ repeated FileDescriptorProto file = 1;
+}
+
+// Describes a complete .proto file.
+message FileDescriptorProto {
+ optional string name = 1; // file name, relative to root of source tree
+ optional string package = 2; // e.g. "foo", "foo.bar", etc.
+
+ // Names of files imported by this file.
+ repeated string dependency = 3;
+ // Indexes of the public imported files in the dependency list above.
+ repeated int32 public_dependency = 10;
+ // Indexes of the weak imported files in the dependency list.
+ // For Google-internal migration only. Do not use.
+ repeated int32 weak_dependency = 11;
+
+ // All top-level definitions in this file.
+ repeated DescriptorProto message_type = 4;
+ repeated EnumDescriptorProto enum_type = 5;
+ repeated ServiceDescriptorProto service = 6;
+ repeated FieldDescriptorProto extension = 7;
+
+ optional FileOptions options = 8;
+
+ // This field contains optional information about the original source code.
+ // You may safely remove this entire field without harming runtime
+ // functionality of the descriptors -- the information is needed only by
+ // development tools.
+ optional SourceCodeInfo source_code_info = 9;
+
+ // The syntax of the proto file.
+ // The supported values are "proto2", "proto3", and "editions".
+ //
+ // If `edition` is present, this value must be "editions".
+ optional string syntax = 12;
+
+ // The edition of the proto file, which is an opaque string.
+ optional string edition = 13;
+}
+
+// Describes a message type.
+message DescriptorProto {
+ optional string name = 1;
+
+ repeated FieldDescriptorProto field = 2;
+ repeated FieldDescriptorProto extension = 6;
+
+ repeated DescriptorProto nested_type = 3;
+ repeated EnumDescriptorProto enum_type = 4;
+
+ message ExtensionRange {
+ optional int32 start = 1; // Inclusive.
+ optional int32 end = 2; // Exclusive.
+
+ optional ExtensionRangeOptions options = 3;
+ }
+ repeated ExtensionRange extension_range = 5;
+
+ repeated OneofDescriptorProto oneof_decl = 8;
+
+ optional MessageOptions options = 7;
+
+ // Range of reserved tag numbers. Reserved tag numbers may not be used by
+ // fields or extension ranges in the same message. Reserved ranges may
+ // not overlap.
+ message ReservedRange {
+ optional int32 start = 1; // Inclusive.
+ optional int32 end = 2; // Exclusive.
+ }
+ repeated ReservedRange reserved_range = 9;
+ // Reserved field names, which may not be used by fields in the same message.
+ // A given name may only be reserved once.
+ repeated string reserved_name = 10;
+}
+
+message ExtensionRangeOptions {
+ // The parser stores options it doesn't recognize here. See above.
+ repeated UninterpretedOption uninterpreted_option = 999;
+
+ message Declaration {
+ // The extension number declared within the extension range.
+ optional int32 number = 1;
+
+ // The fully-qualified name of the extension field. There must be a leading
+ // dot in front of the full name.
+ optional string full_name = 2;
+
+ // The fully-qualified type name of the extension field. Unlike
+ // Metadata.type, Declaration.type must have a leading dot for messages
+ // and enums.
+ optional string type = 3;
+
+ // If true, indicates that the number is reserved in the extension range,
+ // and any extension field with the number will fail to compile. Set this
+ // when a declared extension field is deleted.
+ optional bool reserved = 5;
+
+ // If true, indicates that the extension must be defined as repeated.
+ // Otherwise the extension must be defined as optional.
+ optional bool repeated = 6;
+
+ reserved 4; // removed is_repeated
+ }
+
+ // For external users: DO NOT USE. We are in the process of open sourcing
+ // extension declaration and executing internal cleanups before it can be
+ // used externally.
+ repeated Declaration declaration = 2 [retention = RETENTION_SOURCE];
+
+ // Any features defined in the specific edition.
+ optional FeatureSet features = 50;
+
+ // The verification state of the extension range.
+ enum VerificationState {
+ // All the extensions of the range must be declared.
+ DECLARATION = 0;
+ UNVERIFIED = 1;
+ }
+
+ // The verification state of the range.
+ // TODO(b/278783756): flip the default to DECLARATION once all empty ranges
+ // are marked as UNVERIFIED.
+ optional VerificationState verification = 3 [default = UNVERIFIED];
+
+ // Clients can define custom options in extensions of this message. See above.
+ extensions 1000 to max;
+}
+
+// Describes a field within a message.
+message FieldDescriptorProto {
+ enum Type {
+ // 0 is reserved for errors.
+ // Order is weird for historical reasons.
+ TYPE_DOUBLE = 1;
+ TYPE_FLOAT = 2;
+ // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT64 if
+ // negative values are likely.
+ TYPE_INT64 = 3;
+ TYPE_UINT64 = 4;
+ // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT32 if
+ // negative values are likely.
+ TYPE_INT32 = 5;
+ TYPE_FIXED64 = 6;
+ TYPE_FIXED32 = 7;
+ TYPE_BOOL = 8;
+ TYPE_STRING = 9;
+ // Tag-delimited aggregate.
+ // Group type is deprecated and not supported in proto3. However, Proto3
+ // implementations should still be able to parse the group wire format and
+ // treat group fields as unknown fields.
+ TYPE_GROUP = 10;
+ TYPE_MESSAGE = 11; // Length-delimited aggregate.
+
+ // New in version 2.
+ TYPE_BYTES = 12;
+ TYPE_UINT32 = 13;
+ TYPE_ENUM = 14;
+ TYPE_SFIXED32 = 15;
+ TYPE_SFIXED64 = 16;
+ TYPE_SINT32 = 17; // Uses ZigZag encoding.
+ TYPE_SINT64 = 18; // Uses ZigZag encoding.
+ }
+
+ enum Label {
+ // 0 is reserved for errors
+ LABEL_OPTIONAL = 1;
+ LABEL_REQUIRED = 2;
+ LABEL_REPEATED = 3;
+ }
+
+ optional string name = 1;
+ optional int32 number = 3;
+ optional Label label = 4;
+
+ // If type_name is set, this need not be set. If both this and type_name
+ // are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP.
+ optional Type type = 5;
+
+ // For message and enum types, this is the name of the type. If the name
+ // starts with a '.', it is fully-qualified. Otherwise, C++-like scoping
+ // rules are used to find the type (i.e. first the nested types within this
+ // message are searched, then within the parent, on up to the root
+ // namespace).
+ optional string type_name = 6;
+
+ // For extensions, this is the name of the type being extended. It is
+ // resolved in the same manner as type_name.
+ optional string extendee = 2;
+
+ // For numeric types, contains the original text representation of the value.
+ // For booleans, "true" or "false".
+ // For strings, contains the default text contents (not escaped in any way).
+ // For bytes, contains the C escaped value. All bytes >= 128 are escaped.
+ optional string default_value = 7;
+
+ // If set, gives the index of a oneof in the containing type's oneof_decl
+ // list. This field is a member of that oneof.
+ optional int32 oneof_index = 9;
+
+ // JSON name of this field. The value is set by protocol compiler. If the
+ // user has set a "json_name" option on this field, that option's value
+ // will be used. Otherwise, it's deduced from the field's name by converting
+ // it to camelCase.
+ optional string json_name = 10;
+
+ optional FieldOptions options = 8;
+
+ // If true, this is a proto3 "optional". When a proto3 field is optional, it
+ // tracks presence regardless of field type.
+ //
+ // When proto3_optional is true, this field must be belong to a oneof to
+ // signal to old proto3 clients that presence is tracked for this field. This
+ // oneof is known as a "synthetic" oneof, and this field must be its sole
+ // member (each proto3 optional field gets its own synthetic oneof). Synthetic
+ // oneofs exist in the descriptor only, and do not generate any API. Synthetic
+ // oneofs must be ordered after all "real" oneofs.
+ //
+ // For message fields, proto3_optional doesn't create any semantic change,
+ // since non-repeated message fields always track presence. However it still
+ // indicates the semantic detail of whether the user wrote "optional" or not.
+ // This can be useful for round-tripping the .proto file. For consistency we
+ // give message fields a synthetic oneof also, even though it is not required
+ // to track presence. This is especially important because the parser can't
+ // tell if a field is a message or an enum, so it must always create a
+ // synthetic oneof.
+ //
+ // Proto2 optional fields do not set this flag, because they already indicate
+ // optional with `LABEL_OPTIONAL`.
+ optional bool proto3_optional = 17;
+}
+
+// Describes a oneof.
+message OneofDescriptorProto {
+ optional string name = 1;
+ optional OneofOptions options = 2;
+}
+
+// Describes an enum type.
+message EnumDescriptorProto {
+ optional string name = 1;
+
+ repeated EnumValueDescriptorProto value = 2;
+
+ optional EnumOptions options = 3;
+
+ // Range of reserved numeric values. Reserved values may not be used by
+ // entries in the same enum. Reserved ranges may not overlap.
+ //
+ // Note that this is distinct from DescriptorProto.ReservedRange in that it
+ // is inclusive such that it can appropriately represent the entire int32
+ // domain.
+ message EnumReservedRange {
+ optional int32 start = 1; // Inclusive.
+ optional int32 end = 2; // Inclusive.
+ }
+
+ // Range of reserved numeric values. Reserved numeric values may not be used
+ // by enum values in the same enum declaration. Reserved ranges may not
+ // overlap.
+ repeated EnumReservedRange reserved_range = 4;
+
+ // Reserved enum value names, which may not be reused. A given name may only
+ // be reserved once.
+ repeated string reserved_name = 5;
+}
+
+// Describes a value within an enum.
+message EnumValueDescriptorProto {
+ optional string name = 1;
+ optional int32 number = 2;
+
+ optional EnumValueOptions options = 3;
+}
+
+// Describes a service.
+message ServiceDescriptorProto {
+ optional string name = 1;
+ repeated MethodDescriptorProto method = 2;
+
+ optional ServiceOptions options = 3;
+}
+
+// Describes a method of a service.
+message MethodDescriptorProto {
+ optional string name = 1;
+
+ // Input and output type names. These are resolved in the same way as
+ // FieldDescriptorProto.type_name, but must refer to a message type.
+ optional string input_type = 2;
+ optional string output_type = 3;
+
+ optional MethodOptions options = 4;
+
+ // Identifies if client streams multiple client messages
+ optional bool client_streaming = 5 [default = false];
+ // Identifies if server streams multiple server messages
+ optional bool server_streaming = 6 [default = false];
+}
+
+// ===================================================================
+// Options
+
+// Each of the definitions above may have "options" attached. These are
+// just annotations which may cause code to be generated slightly differently
+// or may contain hints for code that manipulates protocol messages.
+//
+// Clients may define custom options as extensions of the *Options messages.
+// These extensions may not yet be known at parsing time, so the parser cannot
+// store the values in them. Instead it stores them in a field in the *Options
+// message called uninterpreted_option. This field must have the same name
+// across all *Options messages. We then use this field to populate the
+// extensions when we build a descriptor, at which point all protos have been
+// parsed and so all extensions are known.
+//
+// Extension numbers for custom options may be chosen as follows:
+// * For options which will only be used within a single application or
+// organization, or for experimental options, use field numbers 50000
+// through 99999. It is up to you to ensure that you do not use the
+// same number for multiple options.
+// * For options which will be published and used publicly by multiple
+// independent entities, e-mail protobuf-global-extension-registry@google.com
+// to reserve extension numbers. Simply provide your project name (e.g.
+// Objective-C plugin) and your project website (if available) -- there's no
+// need to explain how you intend to use them. Usually you only need one
+// extension number. You can declare multiple options with only one extension
+// number by putting them in a sub-message. See the Custom Options section of
+// the docs for examples:
+// https://developers.google.com/protocol-buffers/docs/proto#options
+// If this turns out to be popular, a web service will be set up
+// to automatically assign option numbers.
+
+message FileOptions {
+
+ // Sets the Java package where classes generated from this .proto will be
+ // placed. By default, the proto package is used, but this is often
+ // inappropriate because proto packages do not normally start with backwards
+ // domain names.
+ optional string java_package = 1;
+
+ // Controls the name of the wrapper Java class generated for the .proto file.
+ // That class will always contain the .proto file's getDescriptor() method as
+ // well as any top-level extensions defined in the .proto file.
+ // If java_multiple_files is disabled, then all the other classes from the
+ // .proto file will be nested inside the single wrapper outer class.
+ optional string java_outer_classname = 8;
+
+ // If enabled, then the Java code generator will generate a separate .java
+ // file for each top-level message, enum, and service defined in the .proto
+ // file. Thus, these types will *not* be nested inside the wrapper class
+ // named by java_outer_classname. However, the wrapper class will still be
+ // generated to contain the file's getDescriptor() method as well as any
+ // top-level extensions defined in the file.
+ optional bool java_multiple_files = 10 [default = false];
+
+ // This option does nothing.
+ optional bool java_generate_equals_and_hash = 20 [deprecated=true];
+
+ // If set true, then the Java2 code generator will generate code that
+ // throws an exception whenever an attempt is made to assign a non-UTF-8
+ // byte sequence to a string field.
+ // Message reflection will do the same.
+ // However, an extension field still accepts non-UTF-8 byte sequences.
+ // This option has no effect on when used with the lite runtime.
+ optional bool java_string_check_utf8 = 27 [default = false];
+
+ // Generated classes can be optimized for speed or code size.
+ enum OptimizeMode {
+ SPEED = 1; // Generate complete code for parsing, serialization,
+ // etc.
+ CODE_SIZE = 2; // Use ReflectionOps to implement these methods.
+ LITE_RUNTIME = 3; // Generate code using MessageLite and the lite runtime.
+ }
+ optional OptimizeMode optimize_for = 9 [default = SPEED];
+
+ // Sets the Go package where structs generated from this .proto will be
+ // placed. If omitted, the Go package will be derived from the following:
+ // - The basename of the package import path, if provided.
+ // - Otherwise, the package statement in the .proto file, if present.
+ // - Otherwise, the basename of the .proto file, without extension.
+ optional string go_package = 11;
+
+ // Should generic services be generated in each language? "Generic" services
+ // are not specific to any particular RPC system. They are generated by the
+ // main code generators in each language (without additional plugins).
+ // Generic services were the only kind of service generation supported by
+ // early versions of google.protobuf.
+ //
+ // Generic services are now considered deprecated in favor of using plugins
+ // that generate code specific to your particular RPC system. Therefore,
+ // these default to false. Old code which depends on generic services should
+ // explicitly set them to true.
+ optional bool cc_generic_services = 16 [default = false];
+ optional bool java_generic_services = 17 [default = false];
+ optional bool py_generic_services = 18 [default = false];
+ optional bool php_generic_services = 42 [default = false];
+
+ // Is this file deprecated?
+ // Depending on the target platform, this can emit Deprecated annotations
+ // for everything in the file, or it will be completely ignored; in the very
+ // least, this is a formalization for deprecating files.
+ optional bool deprecated = 23 [default = false];
+
+ // Enables the use of arenas for the proto messages in this file. This applies
+ // only to generated classes for C++.
+ optional bool cc_enable_arenas = 31 [default = true];
+
+ // Sets the objective c class prefix which is prepended to all objective c
+ // generated classes from this .proto. There is no default.
+ optional string objc_class_prefix = 36;
+
+ // Namespace for generated classes; defaults to the package.
+ optional string csharp_namespace = 37;
+
+ // By default Swift generators will take the proto package and CamelCase it
+ // replacing '.' with underscore and use that to prefix the types/symbols
+ // defined. When this options is provided, they will use this value instead
+ // to prefix the types/symbols defined.
+ optional string swift_prefix = 39;
+
+ // Sets the php class prefix which is prepended to all php generated classes
+ // from this .proto. Default is empty.
+ optional string php_class_prefix = 40;
+
+ // Use this option to change the namespace of php generated classes. Default
+ // is empty. When this option is empty, the package name will be used for
+ // determining the namespace.
+ optional string php_namespace = 41;
+
+ // Use this option to change the namespace of php generated metadata classes.
+ // Default is empty. When this option is empty, the proto file name will be
+ // used for determining the namespace.
+ optional string php_metadata_namespace = 44;
+
+ // Use this option to change the package of ruby generated classes. Default
+ // is empty. When this option is not set, the package name will be used for
+ // determining the ruby package.
+ optional string ruby_package = 45;
+
+ // Any features defined in the specific edition.
+ optional FeatureSet features = 50;
+
+ // The parser stores options it doesn't recognize here.
+ // See the documentation for the "Options" section above.
+ repeated UninterpretedOption uninterpreted_option = 999;
+
+ // Clients can define custom options in extensions of this message.
+ // See the documentation for the "Options" section above.
+ extensions 1000 to max;
+
+ reserved 38;
+}
+
+message MessageOptions {
+ // Set true to use the old proto1 MessageSet wire format for extensions.
+ // This is provided for backwards-compatibility with the MessageSet wire
+ // format. You should not use this for any other reason: It's less
+ // efficient, has fewer features, and is more complicated.
+ //
+ // The message must be defined exactly as follows:
+ // message Foo {
+ // option message_set_wire_format = true;
+ // extensions 4 to max;
+ // }
+ // Note that the message cannot have any defined fields; MessageSets only
+ // have extensions.
+ //
+ // All extensions of your type must be singular messages; e.g. they cannot
+ // be int32s, enums, or repeated messages.
+ //
+ // Because this is an option, the above two restrictions are not enforced by
+ // the protocol compiler.
+ optional bool message_set_wire_format = 1 [default = false];
+
+ // Disables the generation of the standard "descriptor()" accessor, which can
+ // conflict with a field of the same name. This is meant to make migration
+ // from proto1 easier; new code should avoid fields named "descriptor".
+ optional bool no_standard_descriptor_accessor = 2 [default = false];
+
+ // Is this message deprecated?
+ // Depending on the target platform, this can emit Deprecated annotations
+ // for the message, or it will be completely ignored; in the very least,
+ // this is a formalization for deprecating messages.
+ optional bool deprecated = 3 [default = false];
+
+ reserved 4, 5, 6;
+
+ // NOTE: Do not set the option in .proto files. Always use the maps syntax
+ // instead. The option should only be implicitly set by the proto compiler
+ // parser.
+ //
+ // Whether the message is an automatically generated map entry type for the
+ // maps field.
+ //
+ // For maps fields:
+ // map map_field = 1;
+ // The parsed descriptor looks like:
+ // message MapFieldEntry {
+ // option map_entry = true;
+ // optional KeyType key = 1;
+ // optional ValueType value = 2;
+ // }
+ // repeated MapFieldEntry map_field = 1;
+ //
+ // Implementations may choose not to generate the map_entry=true message, but
+ // use a native map in the target language to hold the keys and values.
+ // The reflection APIs in such implementations still need to work as
+ // if the field is a repeated message field.
+ optional bool map_entry = 7;
+
+ reserved 8; // javalite_serializable
+ reserved 9; // javanano_as_lite
+
+ // Enable the legacy handling of JSON field name conflicts. This lowercases
+ // and strips underscored from the fields before comparison in proto3 only.
+ // The new behavior takes `json_name` into account and applies to proto2 as
+ // well.
+ //
+ // This should only be used as a temporary measure against broken builds due
+ // to the change in behavior for JSON field name conflicts.
+ //
+ // TODO(b/261750190) This is legacy behavior we plan to remove once downstream
+ // teams have had time to migrate.
+ optional bool deprecated_legacy_json_field_conflicts = 11 [deprecated = true];
+
+ // Any features defined in the specific edition.
+ optional FeatureSet features = 12;
+
+ // The parser stores options it doesn't recognize here. See above.
+ repeated UninterpretedOption uninterpreted_option = 999;
+
+ // Clients can define custom options in extensions of this message. See above.
+ extensions 1000 to max;
+}
+
+message FieldOptions {
+ // The ctype option instructs the C++ code generator to use a different
+ // representation of the field than it normally would. See the specific
+ // options below. This option is only implemented to support use of
+ // [ctype=CORD] and [ctype=STRING] (the default) on non-repeated fields of
+ // type "bytes" in the open source release -- sorry, we'll try to include
+ // other types in a future version!
+ optional CType ctype = 1 [default = STRING];
+ enum CType {
+ // Default mode.
+ STRING = 0;
+
+ // The option [ctype=CORD] may be applied to a non-repeated field of type
+ // "bytes". It indicates that in C++, the data should be stored in a Cord
+ // instead of a string. For very large strings, this may reduce memory
+ // fragmentation. It may also allow better performance when parsing from a
+ // Cord, or when parsing with aliasing enabled, as the parsed Cord may then
+ // alias the original buffer.
+ CORD = 1;
+
+ STRING_PIECE = 2;
+ }
+ // The packed option can be enabled for repeated primitive fields to enable
+ // a more efficient representation on the wire. Rather than repeatedly
+ // writing the tag and type for each element, the entire array is encoded as
+ // a single length-delimited blob. In proto3, only explicit setting it to
+ // false will avoid using packed encoding.
+ optional bool packed = 2;
+
+ // The jstype option determines the JavaScript type used for values of the
+ // field. The option is permitted only for 64 bit integral and fixed types
+ // (int64, uint64, sint64, fixed64, sfixed64). A field with jstype JS_STRING
+ // is represented as JavaScript string, which avoids loss of precision that
+ // can happen when a large value is converted to a floating point JavaScript.
+ // Specifying JS_NUMBER for the jstype causes the generated JavaScript code to
+ // use the JavaScript "number" type. The behavior of the default option
+ // JS_NORMAL is implementation dependent.
+ //
+ // This option is an enum to permit additional types to be added, e.g.
+ // goog.math.Integer.
+ optional JSType jstype = 6 [default = JS_NORMAL];
+ enum JSType {
+ // Use the default type.
+ JS_NORMAL = 0;
+
+ // Use JavaScript strings.
+ JS_STRING = 1;
+
+ // Use JavaScript numbers.
+ JS_NUMBER = 2;
+ }
+
+ // Should this field be parsed lazily? Lazy applies only to message-type
+ // fields. It means that when the outer message is initially parsed, the
+ // inner message's contents will not be parsed but instead stored in encoded
+ // form. The inner message will actually be parsed when it is first accessed.
+ //
+ // This is only a hint. Implementations are free to choose whether to use
+ // eager or lazy parsing regardless of the value of this option. However,
+ // setting this option true suggests that the protocol author believes that
+ // using lazy parsing on this field is worth the additional bookkeeping
+ // overhead typically needed to implement it.
+ //
+ // This option does not affect the public interface of any generated code;
+ // all method signatures remain the same. Furthermore, thread-safety of the
+ // interface is not affected by this option; const methods remain safe to
+ // call from multiple threads concurrently, while non-const methods continue
+ // to require exclusive access.
+ //
+ // Note that implementations may choose not to check required fields within
+ // a lazy sub-message. That is, calling IsInitialized() on the outer message
+ // may return true even if the inner message has missing required fields.
+ // This is necessary because otherwise the inner message would have to be
+ // parsed in order to perform the check, defeating the purpose of lazy
+ // parsing. An implementation which chooses not to check required fields
+ // must be consistent about it. That is, for any particular sub-message, the
+ // implementation must either *always* check its required fields, or *never*
+ // check its required fields, regardless of whether or not the message has
+ // been parsed.
+ //
+ // As of May 2022, lazy verifies the contents of the byte stream during
+ // parsing. An invalid byte stream will cause the overall parsing to fail.
+ optional bool lazy = 5 [default = false];
+
+ // unverified_lazy does no correctness checks on the byte stream. This should
+ // only be used where lazy with verification is prohibitive for performance
+ // reasons.
+ optional bool unverified_lazy = 15 [default = false];
+
+ // Is this field deprecated?
+ // Depending on the target platform, this can emit Deprecated annotations
+ // for accessors, or it will be completely ignored; in the very least, this
+ // is a formalization for deprecating fields.
+ optional bool deprecated = 3 [default = false];
+
+ // For Google-internal migration only. Do not use.
+ optional bool weak = 10 [default = false];
+
+ // Indicate that the field value should not be printed out when using debug
+ // formats, e.g. when the field contains sensitive credentials.
+ optional bool debug_redact = 16 [default = false];
+
+ // If set to RETENTION_SOURCE, the option will be omitted from the binary.
+ // Note: as of January 2023, support for this is in progress and does not yet
+ // have an effect (b/264593489).
+ enum OptionRetention {
+ RETENTION_UNKNOWN = 0;
+ RETENTION_RUNTIME = 1;
+ RETENTION_SOURCE = 2;
+ }
+
+ optional OptionRetention retention = 17;
+
+ // This indicates the types of entities that the field may apply to when used
+ // as an option. If it is unset, then the field may be freely used as an
+ // option on any kind of entity. Note: as of January 2023, support for this is
+ // in progress and does not yet have an effect (b/264593489).
+ enum OptionTargetType {
+ TARGET_TYPE_UNKNOWN = 0;
+ TARGET_TYPE_FILE = 1;
+ TARGET_TYPE_EXTENSION_RANGE = 2;
+ TARGET_TYPE_MESSAGE = 3;
+ TARGET_TYPE_FIELD = 4;
+ TARGET_TYPE_ONEOF = 5;
+ TARGET_TYPE_ENUM = 6;
+ TARGET_TYPE_ENUM_ENTRY = 7;
+ TARGET_TYPE_SERVICE = 8;
+ TARGET_TYPE_METHOD = 9;
+ }
+
+ repeated OptionTargetType targets = 19;
+
+ message EditionDefault {
+ optional string edition = 1;
+ optional string value = 2; // Textproto value.
+ }
+ repeated EditionDefault edition_defaults = 20;
+
+ // Any features defined in the specific edition.
+ optional FeatureSet features = 21;
+
+ // The parser stores options it doesn't recognize here. See above.
+ repeated UninterpretedOption uninterpreted_option = 999;
+
+ // Clients can define custom options in extensions of this message. See above.
+ extensions 1000 to max;
+
+ reserved 4; // removed jtype
+ reserved 18; // reserve target, target_obsolete_do_not_use
+}
+
+message OneofOptions {
+ // Any features defined in the specific edition.
+ optional FeatureSet features = 1;
+
+ // The parser stores options it doesn't recognize here. See above.
+ repeated UninterpretedOption uninterpreted_option = 999;
+
+ // Clients can define custom options in extensions of this message. See above.
+ extensions 1000 to max;
+}
+
+message EnumOptions {
+
+ // Set this option to true to allow mapping different tag names to the same
+ // value.
+ optional bool allow_alias = 2;
+
+ // Is this enum deprecated?
+ // Depending on the target platform, this can emit Deprecated annotations
+ // for the enum, or it will be completely ignored; in the very least, this
+ // is a formalization for deprecating enums.
+ optional bool deprecated = 3 [default = false];
+
+ reserved 5; // javanano_as_lite
+
+ // Enable the legacy handling of JSON field name conflicts. This lowercases
+ // and strips underscored from the fields before comparison in proto3 only.
+ // The new behavior takes `json_name` into account and applies to proto2 as
+ // well.
+ // TODO(b/261750190) Remove this legacy behavior once downstream teams have
+ // had time to migrate.
+ optional bool deprecated_legacy_json_field_conflicts = 6 [deprecated = true];
+
+ // Any features defined in the specific edition.
+ optional FeatureSet features = 7;
+
+ // The parser stores options it doesn't recognize here. See above.
+ repeated UninterpretedOption uninterpreted_option = 999;
+
+ // Clients can define custom options in extensions of this message. See above.
+ extensions 1000 to max;
+}
+
+message EnumValueOptions {
+ // Is this enum value deprecated?
+ // Depending on the target platform, this can emit Deprecated annotations
+ // for the enum value, or it will be completely ignored; in the very least,
+ // this is a formalization for deprecating enum values.
+ optional bool deprecated = 1 [default = false];
+
+ // Any features defined in the specific edition.
+ optional FeatureSet features = 2;
+
+ // Indicate that fields annotated with this enum value should not be printed
+ // out when using debug formats, e.g. when the field contains sensitive
+ // credentials.
+ optional bool debug_redact = 3 [default = false];
+
+ // The parser stores options it doesn't recognize here. See above.
+ repeated UninterpretedOption uninterpreted_option = 999;
+
+ // Clients can define custom options in extensions of this message. See above.
+ extensions 1000 to max;
+}
+
+message ServiceOptions {
+
+ // Any features defined in the specific edition.
+ optional FeatureSet features = 34;
+
+ // Note: Field numbers 1 through 32 are reserved for Google's internal RPC
+ // framework. We apologize for hoarding these numbers to ourselves, but
+ // we were already using them long before we decided to release Protocol
+ // Buffers.
+
+ // Is this service deprecated?
+ // Depending on the target platform, this can emit Deprecated annotations
+ // for the service, or it will be completely ignored; in the very least,
+ // this is a formalization for deprecating services.
+ optional bool deprecated = 33 [default = false];
+
+ // The parser stores options it doesn't recognize here. See above.
+ repeated UninterpretedOption uninterpreted_option = 999;
+
+ // Clients can define custom options in extensions of this message. See above.
+ extensions 1000 to max;
+}
+
+message MethodOptions {
+
+ // Note: Field numbers 1 through 32 are reserved for Google's internal RPC
+ // framework. We apologize for hoarding these numbers to ourselves, but
+ // we were already using them long before we decided to release Protocol
+ // Buffers.
+
+ // Is this method deprecated?
+ // Depending on the target platform, this can emit Deprecated annotations
+ // for the method, or it will be completely ignored; in the very least,
+ // this is a formalization for deprecating methods.
+ optional bool deprecated = 33 [default = false];
+
+ // Is this method side-effect-free (or safe in HTTP parlance), or idempotent,
+ // or neither? HTTP based RPC implementation may choose GET verb for safe
+ // methods, and PUT verb for idempotent methods instead of the default POST.
+ enum IdempotencyLevel {
+ IDEMPOTENCY_UNKNOWN = 0;
+ NO_SIDE_EFFECTS = 1; // implies idempotent
+ IDEMPOTENT = 2; // idempotent, but may have side effects
+ }
+ optional IdempotencyLevel idempotency_level = 34
+ [default = IDEMPOTENCY_UNKNOWN];
+
+ // Any features defined in the specific edition.
+ optional FeatureSet features = 35;
+
+ // The parser stores options it doesn't recognize here. See above.
+ repeated UninterpretedOption uninterpreted_option = 999;
+
+ // Clients can define custom options in extensions of this message. See above.
+ extensions 1000 to max;
+}
+
+// A message representing a option the parser does not recognize. This only
+// appears in options protos created by the compiler::Parser class.
+// DescriptorPool resolves these when building Descriptor objects. Therefore,
+// options protos in descriptor objects (e.g. returned by Descriptor::options(),
+// or produced by Descriptor::CopyTo()) will never have UninterpretedOptions
+// in them.
+message UninterpretedOption {
+ // The name of the uninterpreted option. Each string represents a segment in
+ // a dot-separated name. is_extension is true iff a segment represents an
+ // extension (denoted with parentheses in options specs in .proto files).
+ // E.g.,{ ["foo", false], ["bar.baz", true], ["moo", false] } represents
+ // "foo.(bar.baz).moo".
+ message NamePart {
+ required string name_part = 1;
+ required bool is_extension = 2;
+ }
+ repeated NamePart name = 2;
+
+ // The value of the uninterpreted option, in whatever type the tokenizer
+ // identified it as during parsing. Exactly one of these should be set.
+ optional string identifier_value = 3;
+ optional uint64 positive_int_value = 4;
+ optional int64 negative_int_value = 5;
+ optional double double_value = 6;
+ optional bytes string_value = 7;
+ optional string aggregate_value = 8;
+}
+
+// ===================================================================
+// Features
+
+// TODO(b/274655146) Enums in C++ gencode (and potentially other languages) are
+// not well scoped. This means that each of the feature enums below can clash
+// with each other. The short names we've chosen maximize call-site
+// readability, but leave us very open to this scenario. A future feature will
+// be designed and implemented to handle this, hopefully before we ever hit a
+// conflict here.
+message FeatureSet {
+ enum FieldPresence {
+ FIELD_PRESENCE_UNKNOWN = 0;
+ EXPLICIT = 1;
+ IMPLICIT = 2;
+ LEGACY_REQUIRED = 3;
+ }
+ optional FieldPresence field_presence = 1 [
+ retention = RETENTION_RUNTIME,
+ targets = TARGET_TYPE_FIELD,
+ targets = TARGET_TYPE_FILE,
+ edition_defaults = { edition: "2023", value: "EXPLICIT" }
+ ];
+
+ enum EnumType {
+ ENUM_TYPE_UNKNOWN = 0;
+ OPEN = 1;
+ CLOSED = 2;
+ }
+ optional EnumType enum_type = 2 [
+ retention = RETENTION_RUNTIME,
+ targets = TARGET_TYPE_ENUM,
+ targets = TARGET_TYPE_FILE,
+ edition_defaults = { edition: "2023", value: "OPEN" }
+ ];
+
+ enum RepeatedFieldEncoding {
+ REPEATED_FIELD_ENCODING_UNKNOWN = 0;
+ PACKED = 1;
+ EXPANDED = 2;
+ }
+ optional RepeatedFieldEncoding repeated_field_encoding = 3 [
+ retention = RETENTION_RUNTIME,
+ targets = TARGET_TYPE_FIELD,
+ targets = TARGET_TYPE_FILE,
+ edition_defaults = { edition: "2023", value: "PACKED" }
+ ];
+
+ enum StringFieldValidation {
+ STRING_FIELD_VALIDATION_UNKNOWN = 0;
+ MANDATORY = 1;
+ HINT = 2;
+ NONE = 3;
+ }
+ optional StringFieldValidation string_field_validation = 4 [
+ retention = RETENTION_RUNTIME,
+ targets = TARGET_TYPE_FIELD,
+ targets = TARGET_TYPE_FILE,
+ edition_defaults = { edition: "2023", value: "MANDATORY" }
+ ];
+
+ enum MessageEncoding {
+ MESSAGE_ENCODING_UNKNOWN = 0;
+ LENGTH_PREFIXED = 1;
+ DELIMITED = 2;
+ }
+ optional MessageEncoding message_encoding = 5 [
+ retention = RETENTION_RUNTIME,
+ targets = TARGET_TYPE_FIELD,
+ targets = TARGET_TYPE_FILE,
+ edition_defaults = { edition: "2023", value: "LENGTH_PREFIXED" }
+ ];
+
+ enum JsonFormat {
+ JSON_FORMAT_UNKNOWN = 0;
+ ALLOW = 1;
+ LEGACY_BEST_EFFORT = 2;
+ }
+ optional JsonFormat json_format = 6 [
+ retention = RETENTION_RUNTIME,
+ targets = TARGET_TYPE_MESSAGE,
+ targets = TARGET_TYPE_ENUM,
+ targets = TARGET_TYPE_FILE,
+ edition_defaults = { edition: "2023", value: "ALLOW" }
+ ];
+
+ optional FeatureSet raw_features = 999 [targets = TARGET_TYPE_UNKNOWN];
+
+ extensions 1000; // for Protobuf C++
+ extensions 1001; // for Protobuf Java
+
+ extensions 9995 to 9999; // For internal testing
+}
+
+// ===================================================================
+// Optional source code info
+
+// Encapsulates information about the original source file from which a
+// FileDescriptorProto was generated.
+message SourceCodeInfo {
+ // A Location identifies a piece of source code in a .proto file which
+ // corresponds to a particular definition. This information is intended
+ // to be useful to IDEs, code indexers, documentation generators, and similar
+ // tools.
+ //
+ // For example, say we have a file like:
+ // message Foo {
+ // optional string foo = 1;
+ // }
+ // Let's look at just the field definition:
+ // optional string foo = 1;
+ // ^ ^^ ^^ ^ ^^^
+ // a bc de f ghi
+ // We have the following locations:
+ // span path represents
+ // [a,i) [ 4, 0, 2, 0 ] The whole field definition.
+ // [a,b) [ 4, 0, 2, 0, 4 ] The label (optional).
+ // [c,d) [ 4, 0, 2, 0, 5 ] The type (string).
+ // [e,f) [ 4, 0, 2, 0, 1 ] The name (foo).
+ // [g,h) [ 4, 0, 2, 0, 3 ] The number (1).
+ //
+ // Notes:
+ // - A location may refer to a repeated field itself (i.e. not to any
+ // particular index within it). This is used whenever a set of elements are
+ // logically enclosed in a single code segment. For example, an entire
+ // extend block (possibly containing multiple extension definitions) will
+ // have an outer location whose path refers to the "extensions" repeated
+ // field without an index.
+ // - Multiple locations may have the same path. This happens when a single
+ // logical declaration is spread out across multiple places. The most
+ // obvious example is the "extend" block again -- there may be multiple
+ // extend blocks in the same scope, each of which will have the same path.
+ // - A location's span is not always a subset of its parent's span. For
+ // example, the "extendee" of an extension declaration appears at the
+ // beginning of the "extend" block and is shared by all extensions within
+ // the block.
+ // - Just because a location's span is a subset of some other location's span
+ // does not mean that it is a descendant. For example, a "group" defines
+ // both a type and a field in a single declaration. Thus, the locations
+ // corresponding to the type and field and their components will overlap.
+ // - Code which tries to interpret locations should probably be designed to
+ // ignore those that it doesn't understand, as more types of locations could
+ // be recorded in the future.
+ repeated Location location = 1;
+ message Location {
+ // Identifies which part of the FileDescriptorProto was defined at this
+ // location.
+ //
+ // Each element is a field number or an index. They form a path from
+ // the root FileDescriptorProto to the place where the definition occurs.
+ // For example, this path:
+ // [ 4, 3, 2, 7, 1 ]
+ // refers to:
+ // file.message_type(3) // 4, 3
+ // .field(7) // 2, 7
+ // .name() // 1
+ // This is because FileDescriptorProto.message_type has field number 4:
+ // repeated DescriptorProto message_type = 4;
+ // and DescriptorProto.field has field number 2:
+ // repeated FieldDescriptorProto field = 2;
+ // and FieldDescriptorProto.name has field number 1:
+ // optional string name = 1;
+ //
+ // Thus, the above path gives the location of a field name. If we removed
+ // the last element:
+ // [ 4, 3, 2, 7 ]
+ // this path refers to the whole field declaration (from the beginning
+ // of the label to the terminating semicolon).
+ repeated int32 path = 1 [packed = true];
+
+ // Always has exactly three or four elements: start line, start column,
+ // end line (optional, otherwise assumed same as start line), end column.
+ // These are packed into a single field for efficiency. Note that line
+ // and column numbers are zero-based -- typically you will want to add
+ // 1 to each before displaying to a user.
+ repeated int32 span = 2 [packed = true];
+
+ // If this SourceCodeInfo represents a complete declaration, these are any
+ // comments appearing before and after the declaration which appear to be
+ // attached to the declaration.
+ //
+ // A series of line comments appearing on consecutive lines, with no other
+ // tokens appearing on those lines, will be treated as a single comment.
+ //
+ // leading_detached_comments will keep paragraphs of comments that appear
+ // before (but not connected to) the current element. Each paragraph,
+ // separated by empty lines, will be one comment element in the repeated
+ // field.
+ //
+ // Only the comment content is provided; comment markers (e.g. //) are
+ // stripped out. For block comments, leading whitespace and an asterisk
+ // will be stripped from the beginning of each line other than the first.
+ // Newlines are included in the output.
+ //
+ // Examples:
+ //
+ // optional int32 foo = 1; // Comment attached to foo.
+ // // Comment attached to bar.
+ // optional int32 bar = 2;
+ //
+ // optional string baz = 3;
+ // // Comment attached to baz.
+ // // Another line attached to baz.
+ //
+ // // Comment attached to moo.
+ // //
+ // // Another line attached to moo.
+ // optional double moo = 4;
+ //
+ // // Detached comment for corge. This is not leading or trailing comments
+ // // to moo or corge because there are blank lines separating it from
+ // // both.
+ //
+ // // Detached comment for corge paragraph 2.
+ //
+ // optional string corge = 5;
+ // /* Block comment attached
+ // * to corge. Leading asterisks
+ // * will be removed. */
+ // /* Block comment attached to
+ // * grault. */
+ // optional int32 grault = 6;
+ //
+ // // ignored detached comments.
+ optional string leading_comments = 3;
+ optional string trailing_comments = 4;
+ repeated string leading_detached_comments = 6;
+ }
+}
+
+// Describes the relationship between generated code and its original source
+// file. A GeneratedCodeInfo message is associated with only one generated
+// source file, but may contain references to different source .proto files.
+message GeneratedCodeInfo {
+ // An Annotation connects some span of text in generated code to an element
+ // of its generating .proto file.
+ repeated Annotation annotation = 1;
+ message Annotation {
+ // Identifies the element in the original source .proto file. This field
+ // is formatted the same as SourceCodeInfo.Location.path.
+ repeated int32 path = 1 [packed = true];
+
+ // Identifies the filesystem path to the original source .proto.
+ optional string source_file = 2;
+
+ // Identifies the starting offset in bytes in the generated code
+ // that relates to the identified object.
+ optional int32 begin = 3;
+
+ // Identifies the ending offset in bytes in the generated code that
+ // relates to the identified object. The end offset should be one past
+ // the last relevant byte (so the length of the text = end - begin).
+ optional int32 end = 4;
+
+ // Represents the identified object's effect on the element in the original
+ // .proto file.
+ enum Semantic {
+ // There is no effect or the effect is indescribable.
+ NONE = 0;
+ // The element is set or otherwise mutated.
+ SET = 1;
+ // An alias to the element is returned.
+ ALIAS = 2;
+ }
+ optional Semantic semantic = 5;
+ }
+}
diff --git a/Config/Tools/protoc/include/google/protobuf/duration.proto b/Config/Tools/protoc/include/google/protobuf/duration.proto
new file mode 100644
index 0000000..41f40c2
--- /dev/null
+++ b/Config/Tools/protoc/include/google/protobuf/duration.proto
@@ -0,0 +1,115 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+syntax = "proto3";
+
+package google.protobuf;
+
+option cc_enable_arenas = true;
+option go_package = "google.golang.org/protobuf/types/known/durationpb";
+option java_package = "com.google.protobuf";
+option java_outer_classname = "DurationProto";
+option java_multiple_files = true;
+option objc_class_prefix = "GPB";
+option csharp_namespace = "Google.Protobuf.WellKnownTypes";
+
+// A Duration represents a signed, fixed-length span of time represented
+// as a count of seconds and fractions of seconds at nanosecond
+// resolution. It is independent of any calendar and concepts like "day"
+// or "month". It is related to Timestamp in that the difference between
+// two Timestamp values is a Duration and it can be added or subtracted
+// from a Timestamp. Range is approximately +-10,000 years.
+//
+// # Examples
+//
+// Example 1: Compute Duration from two Timestamps in pseudo code.
+//
+// Timestamp start = ...;
+// Timestamp end = ...;
+// Duration duration = ...;
+//
+// duration.seconds = end.seconds - start.seconds;
+// duration.nanos = end.nanos - start.nanos;
+//
+// if (duration.seconds < 0 && duration.nanos > 0) {
+// duration.seconds += 1;
+// duration.nanos -= 1000000000;
+// } else if (duration.seconds > 0 && duration.nanos < 0) {
+// duration.seconds -= 1;
+// duration.nanos += 1000000000;
+// }
+//
+// Example 2: Compute Timestamp from Timestamp + Duration in pseudo code.
+//
+// Timestamp start = ...;
+// Duration duration = ...;
+// Timestamp end = ...;
+//
+// end.seconds = start.seconds + duration.seconds;
+// end.nanos = start.nanos + duration.nanos;
+//
+// if (end.nanos < 0) {
+// end.seconds -= 1;
+// end.nanos += 1000000000;
+// } else if (end.nanos >= 1000000000) {
+// end.seconds += 1;
+// end.nanos -= 1000000000;
+// }
+//
+// Example 3: Compute Duration from datetime.timedelta in Python.
+//
+// td = datetime.timedelta(days=3, minutes=10)
+// duration = Duration()
+// duration.FromTimedelta(td)
+//
+// # JSON Mapping
+//
+// In JSON format, the Duration type is encoded as a string rather than an
+// object, where the string ends in the suffix "s" (indicating seconds) and
+// is preceded by the number of seconds, with nanoseconds expressed as
+// fractional seconds. For example, 3 seconds with 0 nanoseconds should be
+// encoded in JSON format as "3s", while 3 seconds and 1 nanosecond should
+// be expressed in JSON format as "3.000000001s", and 3 seconds and 1
+// microsecond should be expressed in JSON format as "3.000001s".
+//
+message Duration {
+ // Signed seconds of the span of time. Must be from -315,576,000,000
+ // to +315,576,000,000 inclusive. Note: these bounds are computed from:
+ // 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
+ int64 seconds = 1;
+
+ // Signed fractions of a second at nanosecond resolution of the span
+ // of time. Durations less than one second are represented with a 0
+ // `seconds` field and a positive or negative `nanos` field. For durations
+ // of one second or more, a non-zero value for the `nanos` field must be
+ // of the same sign as the `seconds` field. Must be from -999,999,999
+ // to +999,999,999 inclusive.
+ int32 nanos = 2;
+}
diff --git a/Config/Tools/protoc/include/google/protobuf/empty.proto b/Config/Tools/protoc/include/google/protobuf/empty.proto
new file mode 100644
index 0000000..b87c89d
--- /dev/null
+++ b/Config/Tools/protoc/include/google/protobuf/empty.proto
@@ -0,0 +1,51 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+syntax = "proto3";
+
+package google.protobuf;
+
+option go_package = "google.golang.org/protobuf/types/known/emptypb";
+option java_package = "com.google.protobuf";
+option java_outer_classname = "EmptyProto";
+option java_multiple_files = true;
+option objc_class_prefix = "GPB";
+option csharp_namespace = "Google.Protobuf.WellKnownTypes";
+option cc_enable_arenas = true;
+
+// A generic empty message that you can re-use to avoid defining duplicated
+// empty messages in your APIs. A typical example is to use it as the request
+// or the response type of an API method. For instance:
+//
+// service Foo {
+// rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
+// }
+//
+message Empty {}
diff --git a/Config/Tools/protoc/include/google/protobuf/field_mask.proto b/Config/Tools/protoc/include/google/protobuf/field_mask.proto
new file mode 100644
index 0000000..b28334b
--- /dev/null
+++ b/Config/Tools/protoc/include/google/protobuf/field_mask.proto
@@ -0,0 +1,245 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+syntax = "proto3";
+
+package google.protobuf;
+
+option java_package = "com.google.protobuf";
+option java_outer_classname = "FieldMaskProto";
+option java_multiple_files = true;
+option objc_class_prefix = "GPB";
+option csharp_namespace = "Google.Protobuf.WellKnownTypes";
+option go_package = "google.golang.org/protobuf/types/known/fieldmaskpb";
+option cc_enable_arenas = true;
+
+// `FieldMask` represents a set of symbolic field paths, for example:
+//
+// paths: "f.a"
+// paths: "f.b.d"
+//
+// Here `f` represents a field in some root message, `a` and `b`
+// fields in the message found in `f`, and `d` a field found in the
+// message in `f.b`.
+//
+// Field masks are used to specify a subset of fields that should be
+// returned by a get operation or modified by an update operation.
+// Field masks also have a custom JSON encoding (see below).
+//
+// # Field Masks in Projections
+//
+// When used in the context of a projection, a response message or
+// sub-message is filtered by the API to only contain those fields as
+// specified in the mask. For example, if the mask in the previous
+// example is applied to a response message as follows:
+//
+// f {
+// a : 22
+// b {
+// d : 1
+// x : 2
+// }
+// y : 13
+// }
+// z: 8
+//
+// The result will not contain specific values for fields x,y and z
+// (their value will be set to the default, and omitted in proto text
+// output):
+//
+//
+// f {
+// a : 22
+// b {
+// d : 1
+// }
+// }
+//
+// A repeated field is not allowed except at the last position of a
+// paths string.
+//
+// If a FieldMask object is not present in a get operation, the
+// operation applies to all fields (as if a FieldMask of all fields
+// had been specified).
+//
+// Note that a field mask does not necessarily apply to the
+// top-level response message. In case of a REST get operation, the
+// field mask applies directly to the response, but in case of a REST
+// list operation, the mask instead applies to each individual message
+// in the returned resource list. In case of a REST custom method,
+// other definitions may be used. Where the mask applies will be
+// clearly documented together with its declaration in the API. In
+// any case, the effect on the returned resource/resources is required
+// behavior for APIs.
+//
+// # Field Masks in Update Operations
+//
+// A field mask in update operations specifies which fields of the
+// targeted resource are going to be updated. The API is required
+// to only change the values of the fields as specified in the mask
+// and leave the others untouched. If a resource is passed in to
+// describe the updated values, the API ignores the values of all
+// fields not covered by the mask.
+//
+// If a repeated field is specified for an update operation, new values will
+// be appended to the existing repeated field in the target resource. Note that
+// a repeated field is only allowed in the last position of a `paths` string.
+//
+// If a sub-message is specified in the last position of the field mask for an
+// update operation, then new value will be merged into the existing sub-message
+// in the target resource.
+//
+// For example, given the target message:
+//
+// f {
+// b {
+// d: 1
+// x: 2
+// }
+// c: [1]
+// }
+//
+// And an update message:
+//
+// f {
+// b {
+// d: 10
+// }
+// c: [2]
+// }
+//
+// then if the field mask is:
+//
+// paths: ["f.b", "f.c"]
+//
+// then the result will be:
+//
+// f {
+// b {
+// d: 10
+// x: 2
+// }
+// c: [1, 2]
+// }
+//
+// An implementation may provide options to override this default behavior for
+// repeated and message fields.
+//
+// In order to reset a field's value to the default, the field must
+// be in the mask and set to the default value in the provided resource.
+// Hence, in order to reset all fields of a resource, provide a default
+// instance of the resource and set all fields in the mask, or do
+// not provide a mask as described below.
+//
+// If a field mask is not present on update, the operation applies to
+// all fields (as if a field mask of all fields has been specified).
+// Note that in the presence of schema evolution, this may mean that
+// fields the client does not know and has therefore not filled into
+// the request will be reset to their default. If this is unwanted
+// behavior, a specific service may require a client to always specify
+// a field mask, producing an error if not.
+//
+// As with get operations, the location of the resource which
+// describes the updated values in the request message depends on the
+// operation kind. In any case, the effect of the field mask is
+// required to be honored by the API.
+//
+// ## Considerations for HTTP REST
+//
+// The HTTP kind of an update operation which uses a field mask must
+// be set to PATCH instead of PUT in order to satisfy HTTP semantics
+// (PUT must only be used for full updates).
+//
+// # JSON Encoding of Field Masks
+//
+// In JSON, a field mask is encoded as a single string where paths are
+// separated by a comma. Fields name in each path are converted
+// to/from lower-camel naming conventions.
+//
+// As an example, consider the following message declarations:
+//
+// message Profile {
+// User user = 1;
+// Photo photo = 2;
+// }
+// message User {
+// string display_name = 1;
+// string address = 2;
+// }
+//
+// In proto a field mask for `Profile` may look as such:
+//
+// mask {
+// paths: "user.display_name"
+// paths: "photo"
+// }
+//
+// In JSON, the same mask is represented as below:
+//
+// {
+// mask: "user.displayName,photo"
+// }
+//
+// # Field Masks and Oneof Fields
+//
+// Field masks treat fields in oneofs just as regular fields. Consider the
+// following message:
+//
+// message SampleMessage {
+// oneof test_oneof {
+// string name = 4;
+// SubMessage sub_message = 9;
+// }
+// }
+//
+// The field mask can be:
+//
+// mask {
+// paths: "name"
+// }
+//
+// Or:
+//
+// mask {
+// paths: "sub_message"
+// }
+//
+// Note that oneof type names ("test_oneof" in this case) cannot be used in
+// paths.
+//
+// ## Field Mask Verification
+//
+// The implementation of any API method which has a FieldMask type field in the
+// request should verify the included field paths, and return an
+// `INVALID_ARGUMENT` error if any path is unmappable.
+message FieldMask {
+ // The set of field mask paths.
+ repeated string paths = 1;
+}
diff --git a/Config/Tools/protoc/include/google/protobuf/source_context.proto b/Config/Tools/protoc/include/google/protobuf/source_context.proto
new file mode 100644
index 0000000..135f50f
--- /dev/null
+++ b/Config/Tools/protoc/include/google/protobuf/source_context.proto
@@ -0,0 +1,48 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+syntax = "proto3";
+
+package google.protobuf;
+
+option java_package = "com.google.protobuf";
+option java_outer_classname = "SourceContextProto";
+option java_multiple_files = true;
+option objc_class_prefix = "GPB";
+option csharp_namespace = "Google.Protobuf.WellKnownTypes";
+option go_package = "google.golang.org/protobuf/types/known/sourcecontextpb";
+
+// `SourceContext` represents information about the source of a
+// protobuf element, like the file in which it is defined.
+message SourceContext {
+ // The path-qualified name of the .proto file that contained the associated
+ // protobuf element. For example: `"google/protobuf/source_context.proto"`.
+ string file_name = 1;
+}
diff --git a/Config/Tools/protoc/include/google/protobuf/struct.proto b/Config/Tools/protoc/include/google/protobuf/struct.proto
new file mode 100644
index 0000000..1bf0c1a
--- /dev/null
+++ b/Config/Tools/protoc/include/google/protobuf/struct.proto
@@ -0,0 +1,95 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+syntax = "proto3";
+
+package google.protobuf;
+
+option cc_enable_arenas = true;
+option go_package = "google.golang.org/protobuf/types/known/structpb";
+option java_package = "com.google.protobuf";
+option java_outer_classname = "StructProto";
+option java_multiple_files = true;
+option objc_class_prefix = "GPB";
+option csharp_namespace = "Google.Protobuf.WellKnownTypes";
+
+// `Struct` represents a structured data value, consisting of fields
+// which map to dynamically typed values. In some languages, `Struct`
+// might be supported by a native representation. For example, in
+// scripting languages like JS a struct is represented as an
+// object. The details of that representation are described together
+// with the proto support for the language.
+//
+// The JSON representation for `Struct` is JSON object.
+message Struct {
+ // Unordered map of dynamically typed values.
+ map fields = 1;
+}
+
+// `Value` represents a dynamically typed value which can be either
+// null, a number, a string, a boolean, a recursive struct value, or a
+// list of values. A producer of value is expected to set one of these
+// variants. Absence of any variant indicates an error.
+//
+// The JSON representation for `Value` is JSON value.
+message Value {
+ // The kind of value.
+ oneof kind {
+ // Represents a null value.
+ NullValue null_value = 1;
+ // Represents a double value.
+ double number_value = 2;
+ // Represents a string value.
+ string string_value = 3;
+ // Represents a boolean value.
+ bool bool_value = 4;
+ // Represents a structured value.
+ Struct struct_value = 5;
+ // Represents a repeated `Value`.
+ ListValue list_value = 6;
+ }
+}
+
+// `NullValue` is a singleton enumeration to represent the null value for the
+// `Value` type union.
+//
+// The JSON representation for `NullValue` is JSON `null`.
+enum NullValue {
+ // Null value.
+ NULL_VALUE = 0;
+}
+
+// `ListValue` is a wrapper around a repeated field of values.
+//
+// The JSON representation for `ListValue` is JSON array.
+message ListValue {
+ // Repeated field of dynamically typed values.
+ repeated Value values = 1;
+}
diff --git a/Config/Tools/protoc/include/google/protobuf/timestamp.proto b/Config/Tools/protoc/include/google/protobuf/timestamp.proto
new file mode 100644
index 0000000..fd0bc07
--- /dev/null
+++ b/Config/Tools/protoc/include/google/protobuf/timestamp.proto
@@ -0,0 +1,144 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+syntax = "proto3";
+
+package google.protobuf;
+
+option cc_enable_arenas = true;
+option go_package = "google.golang.org/protobuf/types/known/timestamppb";
+option java_package = "com.google.protobuf";
+option java_outer_classname = "TimestampProto";
+option java_multiple_files = true;
+option objc_class_prefix = "GPB";
+option csharp_namespace = "Google.Protobuf.WellKnownTypes";
+
+// A Timestamp represents a point in time independent of any time zone or local
+// calendar, encoded as a count of seconds and fractions of seconds at
+// nanosecond resolution. The count is relative to an epoch at UTC midnight on
+// January 1, 1970, in the proleptic Gregorian calendar which extends the
+// Gregorian calendar backwards to year one.
+//
+// All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap
+// second table is needed for interpretation, using a [24-hour linear
+// smear](https://developers.google.com/time/smear).
+//
+// The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
+// restricting to that range, we ensure that we can convert to and from [RFC
+// 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
+//
+// # Examples
+//
+// Example 1: Compute Timestamp from POSIX `time()`.
+//
+// Timestamp timestamp;
+// timestamp.set_seconds(time(NULL));
+// timestamp.set_nanos(0);
+//
+// Example 2: Compute Timestamp from POSIX `gettimeofday()`.
+//
+// struct timeval tv;
+// gettimeofday(&tv, NULL);
+//
+// Timestamp timestamp;
+// timestamp.set_seconds(tv.tv_sec);
+// timestamp.set_nanos(tv.tv_usec * 1000);
+//
+// Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`.
+//
+// FILETIME ft;
+// GetSystemTimeAsFileTime(&ft);
+// UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime;
+//
+// // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z
+// // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z.
+// Timestamp timestamp;
+// timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL));
+// timestamp.set_nanos((INT32) ((ticks % 10000000) * 100));
+//
+// Example 4: Compute Timestamp from Java `System.currentTimeMillis()`.
+//
+// long millis = System.currentTimeMillis();
+//
+// Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000)
+// .setNanos((int) ((millis % 1000) * 1000000)).build();
+//
+// Example 5: Compute Timestamp from Java `Instant.now()`.
+//
+// Instant now = Instant.now();
+//
+// Timestamp timestamp =
+// Timestamp.newBuilder().setSeconds(now.getEpochSecond())
+// .setNanos(now.getNano()).build();
+//
+// Example 6: Compute Timestamp from current time in Python.
+//
+// timestamp = Timestamp()
+// timestamp.GetCurrentTime()
+//
+// # JSON Mapping
+//
+// In JSON format, the Timestamp type is encoded as a string in the
+// [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the
+// format is "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z"
+// where {year} is always expressed using four digits while {month}, {day},
+// {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional
+// seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution),
+// are optional. The "Z" suffix indicates the timezone ("UTC"); the timezone
+// is required. A proto3 JSON serializer should always use UTC (as indicated by
+// "Z") when printing the Timestamp type and a proto3 JSON parser should be
+// able to accept both UTC and other timezones (as indicated by an offset).
+//
+// For example, "2017-01-15T01:30:15.01Z" encodes 15.01 seconds past
+// 01:30 UTC on January 15, 2017.
+//
+// In JavaScript, one can convert a Date object to this format using the
+// standard
+// [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString)
+// method. In Python, a standard `datetime.datetime` object can be converted
+// to this format using
+// [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) with
+// the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one can use
+// the Joda Time's [`ISODateTimeFormat.dateTime()`](
+// http://joda-time.sourceforge.net/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime()
+// ) to obtain a formatter capable of generating timestamps in this format.
+//
+message Timestamp {
+ // Represents seconds of UTC time since Unix epoch
+ // 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
+ // 9999-12-31T23:59:59Z inclusive.
+ int64 seconds = 1;
+
+ // Non-negative fractions of a second at nanosecond resolution. Negative
+ // second values with fractions must still have non-negative nanos values
+ // that count forward in time. Must be from 0 to 999,999,999
+ // inclusive.
+ int32 nanos = 2;
+}
diff --git a/Config/Tools/protoc/include/google/protobuf/type.proto b/Config/Tools/protoc/include/google/protobuf/type.proto
new file mode 100644
index 0000000..48cb11e
--- /dev/null
+++ b/Config/Tools/protoc/include/google/protobuf/type.proto
@@ -0,0 +1,193 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+syntax = "proto3";
+
+package google.protobuf;
+
+import "google/protobuf/any.proto";
+import "google/protobuf/source_context.proto";
+
+option cc_enable_arenas = true;
+option java_package = "com.google.protobuf";
+option java_outer_classname = "TypeProto";
+option java_multiple_files = true;
+option objc_class_prefix = "GPB";
+option csharp_namespace = "Google.Protobuf.WellKnownTypes";
+option go_package = "google.golang.org/protobuf/types/known/typepb";
+
+// A protocol buffer message type.
+message Type {
+ // The fully qualified message name.
+ string name = 1;
+ // The list of fields.
+ repeated Field fields = 2;
+ // The list of types appearing in `oneof` definitions in this type.
+ repeated string oneofs = 3;
+ // The protocol buffer options.
+ repeated Option options = 4;
+ // The source context.
+ SourceContext source_context = 5;
+ // The source syntax.
+ Syntax syntax = 6;
+ // The source edition string, only valid when syntax is SYNTAX_EDITIONS.
+ string edition = 7;
+}
+
+// A single field of a message type.
+message Field {
+ // Basic field types.
+ enum Kind {
+ // Field type unknown.
+ TYPE_UNKNOWN = 0;
+ // Field type double.
+ TYPE_DOUBLE = 1;
+ // Field type float.
+ TYPE_FLOAT = 2;
+ // Field type int64.
+ TYPE_INT64 = 3;
+ // Field type uint64.
+ TYPE_UINT64 = 4;
+ // Field type int32.
+ TYPE_INT32 = 5;
+ // Field type fixed64.
+ TYPE_FIXED64 = 6;
+ // Field type fixed32.
+ TYPE_FIXED32 = 7;
+ // Field type bool.
+ TYPE_BOOL = 8;
+ // Field type string.
+ TYPE_STRING = 9;
+ // Field type group. Proto2 syntax only, and deprecated.
+ TYPE_GROUP = 10;
+ // Field type message.
+ TYPE_MESSAGE = 11;
+ // Field type bytes.
+ TYPE_BYTES = 12;
+ // Field type uint32.
+ TYPE_UINT32 = 13;
+ // Field type enum.
+ TYPE_ENUM = 14;
+ // Field type sfixed32.
+ TYPE_SFIXED32 = 15;
+ // Field type sfixed64.
+ TYPE_SFIXED64 = 16;
+ // Field type sint32.
+ TYPE_SINT32 = 17;
+ // Field type sint64.
+ TYPE_SINT64 = 18;
+ }
+
+ // Whether a field is optional, required, or repeated.
+ enum Cardinality {
+ // For fields with unknown cardinality.
+ CARDINALITY_UNKNOWN = 0;
+ // For optional fields.
+ CARDINALITY_OPTIONAL = 1;
+ // For required fields. Proto2 syntax only.
+ CARDINALITY_REQUIRED = 2;
+ // For repeated fields.
+ CARDINALITY_REPEATED = 3;
+ }
+
+ // The field type.
+ Kind kind = 1;
+ // The field cardinality.
+ Cardinality cardinality = 2;
+ // The field number.
+ int32 number = 3;
+ // The field name.
+ string name = 4;
+ // The field type URL, without the scheme, for message or enumeration
+ // types. Example: `"type.googleapis.com/google.protobuf.Timestamp"`.
+ string type_url = 6;
+ // The index of the field type in `Type.oneofs`, for message or enumeration
+ // types. The first type has index 1; zero means the type is not in the list.
+ int32 oneof_index = 7;
+ // Whether to use alternative packed wire representation.
+ bool packed = 8;
+ // The protocol buffer options.
+ repeated Option options = 9;
+ // The field JSON name.
+ string json_name = 10;
+ // The string value of the default value of this field. Proto2 syntax only.
+ string default_value = 11;
+}
+
+// Enum type definition.
+message Enum {
+ // Enum type name.
+ string name = 1;
+ // Enum value definitions.
+ repeated EnumValue enumvalue = 2;
+ // Protocol buffer options.
+ repeated Option options = 3;
+ // The source context.
+ SourceContext source_context = 4;
+ // The source syntax.
+ Syntax syntax = 5;
+ // The source edition string, only valid when syntax is SYNTAX_EDITIONS.
+ string edition = 6;
+}
+
+// Enum value definition.
+message EnumValue {
+ // Enum value name.
+ string name = 1;
+ // Enum value number.
+ int32 number = 2;
+ // Protocol buffer options.
+ repeated Option options = 3;
+}
+
+// A protocol buffer option, which can be attached to a message, field,
+// enumeration, etc.
+message Option {
+ // The option's name. For protobuf built-in options (options defined in
+ // descriptor.proto), this is the short name. For example, `"map_entry"`.
+ // For custom options, it should be the fully-qualified name. For example,
+ // `"google.api.http"`.
+ string name = 1;
+ // The option's value packed in an Any message. If the value is a primitive,
+ // the corresponding wrapper type defined in google/protobuf/wrappers.proto
+ // should be used. If the value is an enum, it should be stored as an int32
+ // value using the google.protobuf.Int32Value type.
+ Any value = 2;
+}
+
+// The syntax in which a protocol buffer element is defined.
+enum Syntax {
+ // Syntax `proto2`.
+ SYNTAX_PROTO2 = 0;
+ // Syntax `proto3`.
+ SYNTAX_PROTO3 = 1;
+ // Syntax `editions`.
+ SYNTAX_EDITIONS = 2;
+}
diff --git a/Config/Tools/protoc/include/google/protobuf/wrappers.proto b/Config/Tools/protoc/include/google/protobuf/wrappers.proto
new file mode 100644
index 0000000..1959fa5
--- /dev/null
+++ b/Config/Tools/protoc/include/google/protobuf/wrappers.proto
@@ -0,0 +1,123 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Wrappers for primitive (non-message) types. These types are useful
+// for embedding primitives in the `google.protobuf.Any` type and for places
+// where we need to distinguish between the absence of a primitive
+// typed field and its default value.
+//
+// These wrappers have no meaningful use within repeated fields as they lack
+// the ability to detect presence on individual elements.
+// These wrappers have no meaningful use within a map or a oneof since
+// individual entries of a map or fields of a oneof can already detect presence.
+
+syntax = "proto3";
+
+package google.protobuf;
+
+option cc_enable_arenas = true;
+option go_package = "google.golang.org/protobuf/types/known/wrapperspb";
+option java_package = "com.google.protobuf";
+option java_outer_classname = "WrappersProto";
+option java_multiple_files = true;
+option objc_class_prefix = "GPB";
+option csharp_namespace = "Google.Protobuf.WellKnownTypes";
+
+// Wrapper message for `double`.
+//
+// The JSON representation for `DoubleValue` is JSON number.
+message DoubleValue {
+ // The double value.
+ double value = 1;
+}
+
+// Wrapper message for `float`.
+//
+// The JSON representation for `FloatValue` is JSON number.
+message FloatValue {
+ // The float value.
+ float value = 1;
+}
+
+// Wrapper message for `int64`.
+//
+// The JSON representation for `Int64Value` is JSON string.
+message Int64Value {
+ // The int64 value.
+ int64 value = 1;
+}
+
+// Wrapper message for `uint64`.
+//
+// The JSON representation for `UInt64Value` is JSON string.
+message UInt64Value {
+ // The uint64 value.
+ uint64 value = 1;
+}
+
+// Wrapper message for `int32`.
+//
+// The JSON representation for `Int32Value` is JSON number.
+message Int32Value {
+ // The int32 value.
+ int32 value = 1;
+}
+
+// Wrapper message for `uint32`.
+//
+// The JSON representation for `UInt32Value` is JSON number.
+message UInt32Value {
+ // The uint32 value.
+ uint32 value = 1;
+}
+
+// Wrapper message for `bool`.
+//
+// The JSON representation for `BoolValue` is JSON `true` and `false`.
+message BoolValue {
+ // The bool value.
+ bool value = 1;
+}
+
+// Wrapper message for `string`.
+//
+// The JSON representation for `StringValue` is JSON string.
+message StringValue {
+ // The string value.
+ string value = 1;
+}
+
+// Wrapper message for `bytes`.
+//
+// The JSON representation for `BytesValue` is JSON string.
+message BytesValue {
+ // The bytes value.
+ bytes value = 1;
+}
diff --git a/Protobuf/Protobuf/Base.proto b/Protobuf/Protobuf/Base.proto
new file mode 100644
index 0000000..a7a6f0f
--- /dev/null
+++ b/Protobuf/Protobuf/Base.proto
@@ -0,0 +1,21 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+//
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file or at
+// https://developers.google.com/open-source/licenses/bsd
+
+// Author: kenton@google.com (Kenton Varda)
+// Based on original Protocol Buffers design by
+// Sanjay Ghemawat, Jeff Dean, and others.
+//
+// A proto file which is imported by unittest_proto3.proto to test importing.
+
+syntax = "proto3";
+
+package Message;
+//登录回复
+message BaseMessage {
+ int32 messageId = 1;
+ bytes messageData = 2;
+}
diff --git a/Protobuf/Protobuf/Login.proto b/Protobuf/Protobuf/Login.proto
new file mode 100644
index 0000000..2112b80
--- /dev/null
+++ b/Protobuf/Protobuf/Login.proto
@@ -0,0 +1,24 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+//
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file or at
+// https://developers.google.com/open-source/licenses/bsd
+
+// Author: kenton@google.com (Kenton Varda)
+// Based on original Protocol Buffers design by
+// Sanjay Ghemawat, Jeff Dean, and others.
+//
+// A proto file which is imported by unittest_proto3.proto to test importing.
+
+syntax = "proto3";
+package Message;
+message LoginC2S {
+ int64 uid = 1;
+ bytes platform = 2;
+}
+//登录回复
+message LoginS2C {
+ int32 mainLevel = 1;//主线关卡进度
+ int32 limitLevel = 2;//限时关卡
+}
diff --git a/Protobuf/Protobuf/MessageEnum.proto b/Protobuf/Protobuf/MessageEnum.proto
new file mode 100644
index 0000000..97b4cc4
--- /dev/null
+++ b/Protobuf/Protobuf/MessageEnum.proto
@@ -0,0 +1,19 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+//
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file or at
+// https://developers.google.com/open-source/licenses/bsd
+
+// Author: kenton@google.com (Kenton Varda)
+// Based on original Protocol Buffers design by
+// Sanjay Ghemawat, Jeff Dean, and others.
+//
+// A proto file which is imported by unittest_proto3.proto to test importing.
+
+syntax = "proto3";
+package Message;
+
+enum EMessageEnum {
+ Login = 0;
+}
diff --git a/Protobuf/ProtobufCompiler/bin/protoc.exe b/Protobuf/ProtobufCompiler/bin/protoc.exe
new file mode 100644
index 0000000..06328ee
Binary files /dev/null and b/Protobuf/ProtobufCompiler/bin/protoc.exe differ
diff --git a/Protobuf/ProtobufCompiler/include/google/protobuf/any.proto b/Protobuf/ProtobufCompiler/include/google/protobuf/any.proto
new file mode 100644
index 0000000..eff44e5
--- /dev/null
+++ b/Protobuf/ProtobufCompiler/include/google/protobuf/any.proto
@@ -0,0 +1,162 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+syntax = "proto3";
+
+package google.protobuf;
+
+option go_package = "google.golang.org/protobuf/types/known/anypb";
+option java_package = "com.google.protobuf";
+option java_outer_classname = "AnyProto";
+option java_multiple_files = true;
+option objc_class_prefix = "GPB";
+option csharp_namespace = "Google.Protobuf.WellKnownTypes";
+
+// `Any` contains an arbitrary serialized protocol buffer message along with a
+// URL that describes the type of the serialized message.
+//
+// Protobuf library provides support to pack/unpack Any values in the form
+// of utility functions or additional generated methods of the Any type.
+//
+// Example 1: Pack and unpack a message in C++.
+//
+// Foo foo = ...;
+// Any any;
+// any.PackFrom(foo);
+// ...
+// if (any.UnpackTo(&foo)) {
+// ...
+// }
+//
+// Example 2: Pack and unpack a message in Java.
+//
+// Foo foo = ...;
+// Any any = Any.pack(foo);
+// ...
+// if (any.is(Foo.class)) {
+// foo = any.unpack(Foo.class);
+// }
+// // or ...
+// if (any.isSameTypeAs(Foo.getDefaultInstance())) {
+// foo = any.unpack(Foo.getDefaultInstance());
+// }
+//
+// Example 3: Pack and unpack a message in Python.
+//
+// foo = Foo(...)
+// any = Any()
+// any.Pack(foo)
+// ...
+// if any.Is(Foo.DESCRIPTOR):
+// any.Unpack(foo)
+// ...
+//
+// Example 4: Pack and unpack a message in Go
+//
+// foo := &pb.Foo{...}
+// any, err := anypb.New(foo)
+// if err != nil {
+// ...
+// }
+// ...
+// foo := &pb.Foo{}
+// if err := any.UnmarshalTo(foo); err != nil {
+// ...
+// }
+//
+// The pack methods provided by protobuf library will by default use
+// 'type.googleapis.com/full.type.name' as the type URL and the unpack
+// methods only use the fully qualified type name after the last '/'
+// in the type URL, for example "foo.bar.com/x/y.z" will yield type
+// name "y.z".
+//
+// JSON
+// ====
+// The JSON representation of an `Any` value uses the regular
+// representation of the deserialized, embedded message, with an
+// additional field `@type` which contains the type URL. Example:
+//
+// package google.profile;
+// message Person {
+// string first_name = 1;
+// string last_name = 2;
+// }
+//
+// {
+// "@type": "type.googleapis.com/google.profile.Person",
+// "firstName": ,
+// "lastName":
+// }
+//
+// If the embedded message type is well-known and has a custom JSON
+// representation, that representation will be embedded adding a field
+// `value` which holds the custom JSON in addition to the `@type`
+// field. Example (for message [google.protobuf.Duration][]):
+//
+// {
+// "@type": "type.googleapis.com/google.protobuf.Duration",
+// "value": "1.212s"
+// }
+//
+message Any {
+ // A URL/resource name that uniquely identifies the type of the serialized
+ // protocol buffer message. This string must contain at least
+ // one "/" character. The last segment of the URL's path must represent
+ // the fully qualified name of the type (as in
+ // `path/google.protobuf.Duration`). The name should be in a canonical form
+ // (e.g., leading "." is not accepted).
+ //
+ // In practice, teams usually precompile into the binary all types that they
+ // expect it to use in the context of Any. However, for URLs which use the
+ // scheme `http`, `https`, or no scheme, one can optionally set up a type
+ // server that maps type URLs to message definitions as follows:
+ //
+ // * If no scheme is provided, `https` is assumed.
+ // * An HTTP GET on the URL must yield a [google.protobuf.Type][]
+ // value in binary format, or produce an error.
+ // * Applications are allowed to cache lookup results based on the
+ // URL, or have them precompiled into a binary to avoid any
+ // lookup. Therefore, binary compatibility needs to be preserved
+ // on changes to types. (Use versioned type names to manage
+ // breaking changes.)
+ //
+ // Note: this functionality is not currently available in the official
+ // protobuf release, and it is not used for type URLs beginning with
+ // type.googleapis.com. As of May 2023, there are no widely used type server
+ // implementations and no plans to implement one.
+ //
+ // Schemes other than `http`, `https` (or the empty scheme) might be
+ // used with implementation specific semantics.
+ //
+ string type_url = 1;
+
+ // Must be a valid serialized protocol buffer of the above specified type.
+ bytes value = 2;
+}
diff --git a/Protobuf/ProtobufCompiler/include/google/protobuf/api.proto b/Protobuf/ProtobufCompiler/include/google/protobuf/api.proto
new file mode 100644
index 0000000..afc9cc1
--- /dev/null
+++ b/Protobuf/ProtobufCompiler/include/google/protobuf/api.proto
@@ -0,0 +1,207 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+syntax = "proto3";
+
+package google.protobuf;
+
+import "google/protobuf/source_context.proto";
+import "google/protobuf/type.proto";
+
+option java_package = "com.google.protobuf";
+option java_outer_classname = "ApiProto";
+option java_multiple_files = true;
+option objc_class_prefix = "GPB";
+option csharp_namespace = "Google.Protobuf.WellKnownTypes";
+option go_package = "google.golang.org/protobuf/types/known/apipb";
+
+// Api is a light-weight descriptor for an API Interface.
+//
+// Interfaces are also described as "protocol buffer services" in some contexts,
+// such as by the "service" keyword in a .proto file, but they are different
+// from API Services, which represent a concrete implementation of an interface
+// as opposed to simply a description of methods and bindings. They are also
+// sometimes simply referred to as "APIs" in other contexts, such as the name of
+// this message itself. See https://cloud.google.com/apis/design/glossary for
+// detailed terminology.
+message Api {
+ // The fully qualified name of this interface, including package name
+ // followed by the interface's simple name.
+ string name = 1;
+
+ // The methods of this interface, in unspecified order.
+ repeated Method methods = 2;
+
+ // Any metadata attached to the interface.
+ repeated Option options = 3;
+
+ // A version string for this interface. If specified, must have the form
+ // `major-version.minor-version`, as in `1.10`. If the minor version is
+ // omitted, it defaults to zero. If the entire version field is empty, the
+ // major version is derived from the package name, as outlined below. If the
+ // field is not empty, the version in the package name will be verified to be
+ // consistent with what is provided here.
+ //
+ // The versioning schema uses [semantic
+ // versioning](http://semver.org) where the major version number
+ // indicates a breaking change and the minor version an additive,
+ // non-breaking change. Both version numbers are signals to users
+ // what to expect from different versions, and should be carefully
+ // chosen based on the product plan.
+ //
+ // The major version is also reflected in the package name of the
+ // interface, which must end in `v`, as in
+ // `google.feature.v1`. For major versions 0 and 1, the suffix can
+ // be omitted. Zero major versions must only be used for
+ // experimental, non-GA interfaces.
+ //
+ string version = 4;
+
+ // Source context for the protocol buffer service represented by this
+ // message.
+ SourceContext source_context = 5;
+
+ // Included interfaces. See [Mixin][].
+ repeated Mixin mixins = 6;
+
+ // The source syntax of the service.
+ Syntax syntax = 7;
+}
+
+// Method represents a method of an API interface.
+message Method {
+ // The simple name of this method.
+ string name = 1;
+
+ // A URL of the input message type.
+ string request_type_url = 2;
+
+ // If true, the request is streamed.
+ bool request_streaming = 3;
+
+ // The URL of the output message type.
+ string response_type_url = 4;
+
+ // If true, the response is streamed.
+ bool response_streaming = 5;
+
+ // Any metadata attached to the method.
+ repeated Option options = 6;
+
+ // The source syntax of this method.
+ Syntax syntax = 7;
+}
+
+// Declares an API Interface to be included in this interface. The including
+// interface must redeclare all the methods from the included interface, but
+// documentation and options are inherited as follows:
+//
+// - If after comment and whitespace stripping, the documentation
+// string of the redeclared method is empty, it will be inherited
+// from the original method.
+//
+// - Each annotation belonging to the service config (http,
+// visibility) which is not set in the redeclared method will be
+// inherited.
+//
+// - If an http annotation is inherited, the path pattern will be
+// modified as follows. Any version prefix will be replaced by the
+// version of the including interface plus the [root][] path if
+// specified.
+//
+// Example of a simple mixin:
+//
+// package google.acl.v1;
+// service AccessControl {
+// // Get the underlying ACL object.
+// rpc GetAcl(GetAclRequest) returns (Acl) {
+// option (google.api.http).get = "/v1/{resource=**}:getAcl";
+// }
+// }
+//
+// package google.storage.v2;
+// service Storage {
+// rpc GetAcl(GetAclRequest) returns (Acl);
+//
+// // Get a data record.
+// rpc GetData(GetDataRequest) returns (Data) {
+// option (google.api.http).get = "/v2/{resource=**}";
+// }
+// }
+//
+// Example of a mixin configuration:
+//
+// apis:
+// - name: google.storage.v2.Storage
+// mixins:
+// - name: google.acl.v1.AccessControl
+//
+// The mixin construct implies that all methods in `AccessControl` are
+// also declared with same name and request/response types in
+// `Storage`. A documentation generator or annotation processor will
+// see the effective `Storage.GetAcl` method after inheriting
+// documentation and annotations as follows:
+//
+// service Storage {
+// // Get the underlying ACL object.
+// rpc GetAcl(GetAclRequest) returns (Acl) {
+// option (google.api.http).get = "/v2/{resource=**}:getAcl";
+// }
+// ...
+// }
+//
+// Note how the version in the path pattern changed from `v1` to `v2`.
+//
+// If the `root` field in the mixin is specified, it should be a
+// relative path under which inherited HTTP paths are placed. Example:
+//
+// apis:
+// - name: google.storage.v2.Storage
+// mixins:
+// - name: google.acl.v1.AccessControl
+// root: acls
+//
+// This implies the following inherited HTTP annotation:
+//
+// service Storage {
+// // Get the underlying ACL object.
+// rpc GetAcl(GetAclRequest) returns (Acl) {
+// option (google.api.http).get = "/v2/acls/{resource=**}:getAcl";
+// }
+// ...
+// }
+message Mixin {
+ // The fully qualified name of the interface which is included.
+ string name = 1;
+
+ // If non-empty specifies a path under which inherited HTTP paths
+ // are rooted.
+ string root = 2;
+}
diff --git a/Protobuf/ProtobufCompiler/include/google/protobuf/compiler/plugin.proto b/Protobuf/ProtobufCompiler/include/google/protobuf/compiler/plugin.proto
new file mode 100644
index 0000000..033fab2
--- /dev/null
+++ b/Protobuf/ProtobufCompiler/include/google/protobuf/compiler/plugin.proto
@@ -0,0 +1,180 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+//
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file or at
+// https://developers.google.com/open-source/licenses/bsd
+
+// Author: kenton@google.com (Kenton Varda)
+//
+// protoc (aka the Protocol Compiler) can be extended via plugins. A plugin is
+// just a program that reads a CodeGeneratorRequest from stdin and writes a
+// CodeGeneratorResponse to stdout.
+//
+// Plugins written using C++ can use google/protobuf/compiler/plugin.h instead
+// of dealing with the raw protocol defined here.
+//
+// A plugin executable needs only to be placed somewhere in the path. The
+// plugin should be named "protoc-gen-$NAME", and will then be used when the
+// flag "--${NAME}_out" is passed to protoc.
+
+syntax = "proto2";
+
+package google.protobuf.compiler;
+option java_package = "com.google.protobuf.compiler";
+option java_outer_classname = "PluginProtos";
+
+option csharp_namespace = "Google.Protobuf.Compiler";
+option go_package = "google.golang.org/protobuf/types/pluginpb";
+
+import "google/protobuf/descriptor.proto";
+
+// The version number of protocol compiler.
+message Version {
+ optional int32 major = 1;
+ optional int32 minor = 2;
+ optional int32 patch = 3;
+ // A suffix for alpha, beta or rc release, e.g., "alpha-1", "rc2". It should
+ // be empty for mainline stable releases.
+ optional string suffix = 4;
+}
+
+// An encoded CodeGeneratorRequest is written to the plugin's stdin.
+message CodeGeneratorRequest {
+ // The .proto files that were explicitly listed on the command-line. The
+ // code generator should generate code only for these files. Each file's
+ // descriptor will be included in proto_file, below.
+ repeated string file_to_generate = 1;
+
+ // The generator parameter passed on the command-line.
+ optional string parameter = 2;
+
+ // FileDescriptorProtos for all files in files_to_generate and everything
+ // they import. The files will appear in topological order, so each file
+ // appears before any file that imports it.
+ //
+ // Note: the files listed in files_to_generate will include runtime-retention
+ // options only, but all other files will include source-retention options.
+ // The source_file_descriptors field below is available in case you need
+ // source-retention options for files_to_generate.
+ //
+ // protoc guarantees that all proto_files will be written after
+ // the fields above, even though this is not technically guaranteed by the
+ // protobuf wire format. This theoretically could allow a plugin to stream
+ // in the FileDescriptorProtos and handle them one by one rather than read
+ // the entire set into memory at once. However, as of this writing, this
+ // is not similarly optimized on protoc's end -- it will store all fields in
+ // memory at once before sending them to the plugin.
+ //
+ // Type names of fields and extensions in the FileDescriptorProto are always
+ // fully qualified.
+ repeated FileDescriptorProto proto_file = 15;
+
+ // File descriptors with all options, including source-retention options.
+ // These descriptors are only provided for the files listed in
+ // files_to_generate.
+ repeated FileDescriptorProto source_file_descriptors = 17;
+
+ // The version number of protocol compiler.
+ optional Version compiler_version = 3;
+}
+
+// The plugin writes an encoded CodeGeneratorResponse to stdout.
+message CodeGeneratorResponse {
+ // Error message. If non-empty, code generation failed. The plugin process
+ // should exit with status code zero even if it reports an error in this way.
+ //
+ // This should be used to indicate errors in .proto files which prevent the
+ // code generator from generating correct code. Errors which indicate a
+ // problem in protoc itself -- such as the input CodeGeneratorRequest being
+ // unparseable -- should be reported by writing a message to stderr and
+ // exiting with a non-zero status code.
+ optional string error = 1;
+
+ // A bitmask of supported features that the code generator supports.
+ // This is a bitwise "or" of values from the Feature enum.
+ optional uint64 supported_features = 2;
+
+ // Sync with code_generator.h.
+ enum Feature {
+ FEATURE_NONE = 0;
+ FEATURE_PROTO3_OPTIONAL = 1;
+ FEATURE_SUPPORTS_EDITIONS = 2;
+ }
+
+ // The minimum edition this plugin supports. This will be treated as an
+ // Edition enum, but we want to allow unknown values. It should be specified
+ // according the edition enum value, *not* the edition number. Only takes
+ // effect for plugins that have FEATURE_SUPPORTS_EDITIONS set.
+ optional int32 minimum_edition = 3;
+
+ // The maximum edition this plugin supports. This will be treated as an
+ // Edition enum, but we want to allow unknown values. It should be specified
+ // according the edition enum value, *not* the edition number. Only takes
+ // effect for plugins that have FEATURE_SUPPORTS_EDITIONS set.
+ optional int32 maximum_edition = 4;
+
+ // Represents a single generated file.
+ message File {
+ // The file name, relative to the output directory. The name must not
+ // contain "." or ".." components and must be relative, not be absolute (so,
+ // the file cannot lie outside the output directory). "/" must be used as
+ // the path separator, not "\".
+ //
+ // If the name is omitted, the content will be appended to the previous
+ // file. This allows the generator to break large files into small chunks,
+ // and allows the generated text to be streamed back to protoc so that large
+ // files need not reside completely in memory at one time. Note that as of
+ // this writing protoc does not optimize for this -- it will read the entire
+ // CodeGeneratorResponse before writing files to disk.
+ optional string name = 1;
+
+ // If non-empty, indicates that the named file should already exist, and the
+ // content here is to be inserted into that file at a defined insertion
+ // point. This feature allows a code generator to extend the output
+ // produced by another code generator. The original generator may provide
+ // insertion points by placing special annotations in the file that look
+ // like:
+ // @@protoc_insertion_point(NAME)
+ // The annotation can have arbitrary text before and after it on the line,
+ // which allows it to be placed in a comment. NAME should be replaced with
+ // an identifier naming the point -- this is what other generators will use
+ // as the insertion_point. Code inserted at this point will be placed
+ // immediately above the line containing the insertion point (thus multiple
+ // insertions to the same point will come out in the order they were added).
+ // The double-@ is intended to make it unlikely that the generated code
+ // could contain things that look like insertion points by accident.
+ //
+ // For example, the C++ code generator places the following line in the
+ // .pb.h files that it generates:
+ // // @@protoc_insertion_point(namespace_scope)
+ // This line appears within the scope of the file's package namespace, but
+ // outside of any particular class. Another plugin can then specify the
+ // insertion_point "namespace_scope" to generate additional classes or
+ // other declarations that should be placed in this scope.
+ //
+ // Note that if the line containing the insertion point begins with
+ // whitespace, the same whitespace will be added to every line of the
+ // inserted text. This is useful for languages like Python, where
+ // indentation matters. In these languages, the insertion point comment
+ // should be indented the same amount as any inserted code will need to be
+ // in order to work correctly in that context.
+ //
+ // The code generator that generates the initial file and the one which
+ // inserts into it must both run as part of a single invocation of protoc.
+ // Code generators are executed in the order in which they appear on the
+ // command line.
+ //
+ // If |insertion_point| is present, |name| must also be present.
+ optional string insertion_point = 2;
+
+ // The file contents.
+ optional string content = 15;
+
+ // Information describing the file content being inserted. If an insertion
+ // point is used, this information will be appropriately offset and inserted
+ // into the code generation metadata for the generated files.
+ optional GeneratedCodeInfo generated_code_info = 16;
+ }
+ repeated File file = 15;
+}
diff --git a/Protobuf/ProtobufCompiler/include/google/protobuf/cpp_features.proto b/Protobuf/ProtobufCompiler/include/google/protobuf/cpp_features.proto
new file mode 100644
index 0000000..a0d1929
--- /dev/null
+++ b/Protobuf/ProtobufCompiler/include/google/protobuf/cpp_features.proto
@@ -0,0 +1,67 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2023 Google Inc. All rights reserved.
+//
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file or at
+// https://developers.google.com/open-source/licenses/bsd
+
+syntax = "proto2";
+
+package pb;
+
+import "google/protobuf/descriptor.proto";
+
+extend google.protobuf.FeatureSet {
+ optional CppFeatures cpp = 1000;
+}
+
+message CppFeatures {
+ // Whether or not to treat an enum field as closed. This option is only
+ // applicable to enum fields, and will be removed in the future. It is
+ // consistent with the legacy behavior of using proto3 enum types for proto2
+ // fields.
+ optional bool legacy_closed_enum = 1 [
+ retention = RETENTION_RUNTIME,
+ targets = TARGET_TYPE_FIELD,
+ targets = TARGET_TYPE_FILE,
+ feature_support = {
+ edition_introduced: EDITION_2023,
+ edition_deprecated: EDITION_2023,
+ deprecation_warning: "The legacy closed enum behavior in C++ is "
+ "deprecated and is scheduled to be removed in "
+ "edition 2025. See http://protobuf.dev/programming-guides/enum/#cpp for "
+ "more information",
+ },
+ edition_defaults = { edition: EDITION_LEGACY, value: "true" },
+ edition_defaults = { edition: EDITION_PROTO3, value: "false" }
+ ];
+
+ enum StringType {
+ STRING_TYPE_UNKNOWN = 0;
+ VIEW = 1;
+ CORD = 2;
+ STRING = 3;
+ }
+
+ optional StringType string_type = 2 [
+ retention = RETENTION_RUNTIME,
+ targets = TARGET_TYPE_FIELD,
+ targets = TARGET_TYPE_FILE,
+ feature_support = {
+ edition_introduced: EDITION_2023,
+ },
+ edition_defaults = { edition: EDITION_LEGACY, value: "STRING" },
+ edition_defaults = { edition: EDITION_2024, value: "VIEW" }
+ ];
+
+ optional bool enum_name_uses_string_view = 3 [
+ retention = RETENTION_SOURCE,
+ targets = TARGET_TYPE_ENUM,
+ targets = TARGET_TYPE_FILE,
+ feature_support = {
+ edition_introduced: EDITION_2024,
+ },
+ edition_defaults = { edition: EDITION_LEGACY, value: "false" },
+ edition_defaults = { edition: EDITION_2024, value: "true" }
+ ];
+}
diff --git a/Protobuf/ProtobufCompiler/include/google/protobuf/descriptor.proto b/Protobuf/ProtobufCompiler/include/google/protobuf/descriptor.proto
new file mode 100644
index 0000000..f63ff19
--- /dev/null
+++ b/Protobuf/ProtobufCompiler/include/google/protobuf/descriptor.proto
@@ -0,0 +1,1365 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Author: kenton@google.com (Kenton Varda)
+// Based on original Protocol Buffers design by
+// Sanjay Ghemawat, Jeff Dean, and others.
+//
+// The messages in this file describe the definitions found in .proto files.
+// A valid .proto file can be translated directly to a FileDescriptorProto
+// without any other information (e.g. without reading its imports).
+
+syntax = "proto2";
+
+package google.protobuf;
+
+option go_package = "google.golang.org/protobuf/types/descriptorpb";
+option java_package = "com.google.protobuf";
+option java_outer_classname = "DescriptorProtos";
+option csharp_namespace = "Google.Protobuf.Reflection";
+option objc_class_prefix = "GPB";
+option cc_enable_arenas = true;
+
+// descriptor.proto must be optimized for speed because reflection-based
+// algorithms don't work during bootstrapping.
+option optimize_for = SPEED;
+
+// The protocol compiler can output a FileDescriptorSet containing the .proto
+// files it parses.
+message FileDescriptorSet {
+ repeated FileDescriptorProto file = 1;
+
+ // Extensions for tooling.
+ extensions 536000000 [declaration = {
+ number: 536000000
+ type: ".buf.descriptor.v1.FileDescriptorSetExtension"
+ full_name: ".buf.descriptor.v1.buf_file_descriptor_set_extension"
+ }];
+}
+
+// The full set of known editions.
+enum Edition {
+ // A placeholder for an unknown edition value.
+ EDITION_UNKNOWN = 0;
+
+ // A placeholder edition for specifying default behaviors *before* a feature
+ // was first introduced. This is effectively an "infinite past".
+ EDITION_LEGACY = 900;
+
+ // Legacy syntax "editions". These pre-date editions, but behave much like
+ // distinct editions. These can't be used to specify the edition of proto
+ // files, but feature definitions must supply proto2/proto3 defaults for
+ // backwards compatibility.
+ EDITION_PROTO2 = 998;
+ EDITION_PROTO3 = 999;
+
+ // Editions that have been released. The specific values are arbitrary and
+ // should not be depended on, but they will always be time-ordered for easy
+ // comparison.
+ EDITION_2023 = 1000;
+ EDITION_2024 = 1001;
+
+ // Placeholder editions for testing feature resolution. These should not be
+ // used or relied on outside of tests.
+ EDITION_1_TEST_ONLY = 1;
+ EDITION_2_TEST_ONLY = 2;
+ EDITION_99997_TEST_ONLY = 99997;
+ EDITION_99998_TEST_ONLY = 99998;
+ EDITION_99999_TEST_ONLY = 99999;
+
+ // Placeholder for specifying unbounded edition support. This should only
+ // ever be used by plugins that can expect to never require any changes to
+ // support a new edition.
+ EDITION_MAX = 0x7FFFFFFF;
+}
+
+// Describes a complete .proto file.
+message FileDescriptorProto {
+ optional string name = 1; // file name, relative to root of source tree
+ optional string package = 2; // e.g. "foo", "foo.bar", etc.
+
+ // Names of files imported by this file.
+ repeated string dependency = 3;
+ // Indexes of the public imported files in the dependency list above.
+ repeated int32 public_dependency = 10;
+ // Indexes of the weak imported files in the dependency list.
+ // For Google-internal migration only. Do not use.
+ repeated int32 weak_dependency = 11;
+
+ // All top-level definitions in this file.
+ repeated DescriptorProto message_type = 4;
+ repeated EnumDescriptorProto enum_type = 5;
+ repeated ServiceDescriptorProto service = 6;
+ repeated FieldDescriptorProto extension = 7;
+
+ optional FileOptions options = 8;
+
+ // This field contains optional information about the original source code.
+ // You may safely remove this entire field without harming runtime
+ // functionality of the descriptors -- the information is needed only by
+ // development tools.
+ optional SourceCodeInfo source_code_info = 9;
+
+ // The syntax of the proto file.
+ // The supported values are "proto2", "proto3", and "editions".
+ //
+ // If `edition` is present, this value must be "editions".
+ // WARNING: This field should only be used by protobuf plugins or special
+ // cases like the proto compiler. Other uses are discouraged and
+ // developers should rely on the protoreflect APIs for their client language.
+ optional string syntax = 12;
+
+ // The edition of the proto file.
+ // WARNING: This field should only be used by protobuf plugins or special
+ // cases like the proto compiler. Other uses are discouraged and
+ // developers should rely on the protoreflect APIs for their client language.
+ optional Edition edition = 14;
+}
+
+// Describes a message type.
+message DescriptorProto {
+ optional string name = 1;
+
+ repeated FieldDescriptorProto field = 2;
+ repeated FieldDescriptorProto extension = 6;
+
+ repeated DescriptorProto nested_type = 3;
+ repeated EnumDescriptorProto enum_type = 4;
+
+ message ExtensionRange {
+ optional int32 start = 1; // Inclusive.
+ optional int32 end = 2; // Exclusive.
+
+ optional ExtensionRangeOptions options = 3;
+ }
+ repeated ExtensionRange extension_range = 5;
+
+ repeated OneofDescriptorProto oneof_decl = 8;
+
+ optional MessageOptions options = 7;
+
+ // Range of reserved tag numbers. Reserved tag numbers may not be used by
+ // fields or extension ranges in the same message. Reserved ranges may
+ // not overlap.
+ message ReservedRange {
+ optional int32 start = 1; // Inclusive.
+ optional int32 end = 2; // Exclusive.
+ }
+ repeated ReservedRange reserved_range = 9;
+ // Reserved field names, which may not be used by fields in the same message.
+ // A given name may only be reserved once.
+ repeated string reserved_name = 10;
+}
+
+message ExtensionRangeOptions {
+ // The parser stores options it doesn't recognize here. See above.
+ repeated UninterpretedOption uninterpreted_option = 999;
+
+ message Declaration {
+ // The extension number declared within the extension range.
+ optional int32 number = 1;
+
+ // The fully-qualified name of the extension field. There must be a leading
+ // dot in front of the full name.
+ optional string full_name = 2;
+
+ // The fully-qualified type name of the extension field. Unlike
+ // Metadata.type, Declaration.type must have a leading dot for messages
+ // and enums.
+ optional string type = 3;
+
+ // If true, indicates that the number is reserved in the extension range,
+ // and any extension field with the number will fail to compile. Set this
+ // when a declared extension field is deleted.
+ optional bool reserved = 5;
+
+ // If true, indicates that the extension must be defined as repeated.
+ // Otherwise the extension must be defined as optional.
+ optional bool repeated = 6;
+
+ reserved 4; // removed is_repeated
+ }
+
+ // For external users: DO NOT USE. We are in the process of open sourcing
+ // extension declaration and executing internal cleanups before it can be
+ // used externally.
+ repeated Declaration declaration = 2 [retention = RETENTION_SOURCE];
+
+ // Any features defined in the specific edition.
+ optional FeatureSet features = 50;
+
+ // The verification state of the extension range.
+ enum VerificationState {
+ // All the extensions of the range must be declared.
+ DECLARATION = 0;
+ UNVERIFIED = 1;
+ }
+
+ // The verification state of the range.
+ // TODO: flip the default to DECLARATION once all empty ranges
+ // are marked as UNVERIFIED.
+ optional VerificationState verification = 3
+ [default = UNVERIFIED, retention = RETENTION_SOURCE];
+
+ // Clients can define custom options in extensions of this message. See above.
+ extensions 1000 to max;
+}
+
+// Describes a field within a message.
+message FieldDescriptorProto {
+ enum Type {
+ // 0 is reserved for errors.
+ // Order is weird for historical reasons.
+ TYPE_DOUBLE = 1;
+ TYPE_FLOAT = 2;
+ // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT64 if
+ // negative values are likely.
+ TYPE_INT64 = 3;
+ TYPE_UINT64 = 4;
+ // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT32 if
+ // negative values are likely.
+ TYPE_INT32 = 5;
+ TYPE_FIXED64 = 6;
+ TYPE_FIXED32 = 7;
+ TYPE_BOOL = 8;
+ TYPE_STRING = 9;
+ // Tag-delimited aggregate.
+ // Group type is deprecated and not supported after google.protobuf. However, Proto3
+ // implementations should still be able to parse the group wire format and
+ // treat group fields as unknown fields. In Editions, the group wire format
+ // can be enabled via the `message_encoding` feature.
+ TYPE_GROUP = 10;
+ TYPE_MESSAGE = 11; // Length-delimited aggregate.
+
+ // New in version 2.
+ TYPE_BYTES = 12;
+ TYPE_UINT32 = 13;
+ TYPE_ENUM = 14;
+ TYPE_SFIXED32 = 15;
+ TYPE_SFIXED64 = 16;
+ TYPE_SINT32 = 17; // Uses ZigZag encoding.
+ TYPE_SINT64 = 18; // Uses ZigZag encoding.
+ }
+
+ enum Label {
+ // 0 is reserved for errors
+ LABEL_OPTIONAL = 1;
+ LABEL_REPEATED = 3;
+ // The required label is only allowed in google.protobuf. In proto3 and Editions
+ // it's explicitly prohibited. In Editions, the `field_presence` feature
+ // can be used to get this behavior.
+ LABEL_REQUIRED = 2;
+ }
+
+ optional string name = 1;
+ optional int32 number = 3;
+ optional Label label = 4;
+
+ // If type_name is set, this need not be set. If both this and type_name
+ // are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP.
+ optional Type type = 5;
+
+ // For message and enum types, this is the name of the type. If the name
+ // starts with a '.', it is fully-qualified. Otherwise, C++-like scoping
+ // rules are used to find the type (i.e. first the nested types within this
+ // message are searched, then within the parent, on up to the root
+ // namespace).
+ optional string type_name = 6;
+
+ // For extensions, this is the name of the type being extended. It is
+ // resolved in the same manner as type_name.
+ optional string extendee = 2;
+
+ // For numeric types, contains the original text representation of the value.
+ // For booleans, "true" or "false".
+ // For strings, contains the default text contents (not escaped in any way).
+ // For bytes, contains the C escaped value. All bytes >= 128 are escaped.
+ optional string default_value = 7;
+
+ // If set, gives the index of a oneof in the containing type's oneof_decl
+ // list. This field is a member of that oneof.
+ optional int32 oneof_index = 9;
+
+ // JSON name of this field. The value is set by protocol compiler. If the
+ // user has set a "json_name" option on this field, that option's value
+ // will be used. Otherwise, it's deduced from the field's name by converting
+ // it to camelCase.
+ optional string json_name = 10;
+
+ optional FieldOptions options = 8;
+
+ // If true, this is a proto3 "optional". When a proto3 field is optional, it
+ // tracks presence regardless of field type.
+ //
+ // When proto3_optional is true, this field must belong to a oneof to signal
+ // to old proto3 clients that presence is tracked for this field. This oneof
+ // is known as a "synthetic" oneof, and this field must be its sole member
+ // (each proto3 optional field gets its own synthetic oneof). Synthetic oneofs
+ // exist in the descriptor only, and do not generate any API. Synthetic oneofs
+ // must be ordered after all "real" oneofs.
+ //
+ // For message fields, proto3_optional doesn't create any semantic change,
+ // since non-repeated message fields always track presence. However it still
+ // indicates the semantic detail of whether the user wrote "optional" or not.
+ // This can be useful for round-tripping the .proto file. For consistency we
+ // give message fields a synthetic oneof also, even though it is not required
+ // to track presence. This is especially important because the parser can't
+ // tell if a field is a message or an enum, so it must always create a
+ // synthetic oneof.
+ //
+ // Proto2 optional fields do not set this flag, because they already indicate
+ // optional with `LABEL_OPTIONAL`.
+ optional bool proto3_optional = 17;
+}
+
+// Describes a oneof.
+message OneofDescriptorProto {
+ optional string name = 1;
+ optional OneofOptions options = 2;
+}
+
+// Describes an enum type.
+message EnumDescriptorProto {
+ optional string name = 1;
+
+ repeated EnumValueDescriptorProto value = 2;
+
+ optional EnumOptions options = 3;
+
+ // Range of reserved numeric values. Reserved values may not be used by
+ // entries in the same enum. Reserved ranges may not overlap.
+ //
+ // Note that this is distinct from DescriptorProto.ReservedRange in that it
+ // is inclusive such that it can appropriately represent the entire int32
+ // domain.
+ message EnumReservedRange {
+ optional int32 start = 1; // Inclusive.
+ optional int32 end = 2; // Inclusive.
+ }
+
+ // Range of reserved numeric values. Reserved numeric values may not be used
+ // by enum values in the same enum declaration. Reserved ranges may not
+ // overlap.
+ repeated EnumReservedRange reserved_range = 4;
+
+ // Reserved enum value names, which may not be reused. A given name may only
+ // be reserved once.
+ repeated string reserved_name = 5;
+}
+
+// Describes a value within an enum.
+message EnumValueDescriptorProto {
+ optional string name = 1;
+ optional int32 number = 2;
+
+ optional EnumValueOptions options = 3;
+}
+
+// Describes a service.
+message ServiceDescriptorProto {
+ optional string name = 1;
+ repeated MethodDescriptorProto method = 2;
+
+ optional ServiceOptions options = 3;
+}
+
+// Describes a method of a service.
+message MethodDescriptorProto {
+ optional string name = 1;
+
+ // Input and output type names. These are resolved in the same way as
+ // FieldDescriptorProto.type_name, but must refer to a message type.
+ optional string input_type = 2;
+ optional string output_type = 3;
+
+ optional MethodOptions options = 4;
+
+ // Identifies if client streams multiple client messages
+ optional bool client_streaming = 5 [default = false];
+ // Identifies if server streams multiple server messages
+ optional bool server_streaming = 6 [default = false];
+}
+
+// ===================================================================
+// Options
+
+// Each of the definitions above may have "options" attached. These are
+// just annotations which may cause code to be generated slightly differently
+// or may contain hints for code that manipulates protocol messages.
+//
+// Clients may define custom options as extensions of the *Options messages.
+// These extensions may not yet be known at parsing time, so the parser cannot
+// store the values in them. Instead it stores them in a field in the *Options
+// message called uninterpreted_option. This field must have the same name
+// across all *Options messages. We then use this field to populate the
+// extensions when we build a descriptor, at which point all protos have been
+// parsed and so all extensions are known.
+//
+// Extension numbers for custom options may be chosen as follows:
+// * For options which will only be used within a single application or
+// organization, or for experimental options, use field numbers 50000
+// through 99999. It is up to you to ensure that you do not use the
+// same number for multiple options.
+// * For options which will be published and used publicly by multiple
+// independent entities, e-mail protobuf-global-extension-registry@google.com
+// to reserve extension numbers. Simply provide your project name (e.g.
+// Objective-C plugin) and your project website (if available) -- there's no
+// need to explain how you intend to use them. Usually you only need one
+// extension number. You can declare multiple options with only one extension
+// number by putting them in a sub-message. See the Custom Options section of
+// the docs for examples:
+// https://developers.google.com/protocol-buffers/docs/proto#options
+// If this turns out to be popular, a web service will be set up
+// to automatically assign option numbers.
+
+message FileOptions {
+
+ // Sets the Java package where classes generated from this .proto will be
+ // placed. By default, the proto package is used, but this is often
+ // inappropriate because proto packages do not normally start with backwards
+ // domain names.
+ optional string java_package = 1;
+
+ // Controls the name of the wrapper Java class generated for the .proto file.
+ // That class will always contain the .proto file's getDescriptor() method as
+ // well as any top-level extensions defined in the .proto file.
+ // If java_multiple_files is disabled, then all the other classes from the
+ // .proto file will be nested inside the single wrapper outer class.
+ optional string java_outer_classname = 8;
+
+ // If enabled, then the Java code generator will generate a separate .java
+ // file for each top-level message, enum, and service defined in the .proto
+ // file. Thus, these types will *not* be nested inside the wrapper class
+ // named by java_outer_classname. However, the wrapper class will still be
+ // generated to contain the file's getDescriptor() method as well as any
+ // top-level extensions defined in the file.
+ optional bool java_multiple_files = 10 [default = false];
+
+ // This option does nothing.
+ optional bool java_generate_equals_and_hash = 20 [deprecated=true];
+
+ // A proto2 file can set this to true to opt in to UTF-8 checking for Java,
+ // which will throw an exception if invalid UTF-8 is parsed from the wire or
+ // assigned to a string field.
+ //
+ // TODO: clarify exactly what kinds of field types this option
+ // applies to, and update these docs accordingly.
+ //
+ // Proto3 files already perform these checks. Setting the option explicitly to
+ // false has no effect: it cannot be used to opt proto3 files out of UTF-8
+ // checks.
+ optional bool java_string_check_utf8 = 27 [default = false];
+
+ // Generated classes can be optimized for speed or code size.
+ enum OptimizeMode {
+ SPEED = 1; // Generate complete code for parsing, serialization,
+ // etc.
+ CODE_SIZE = 2; // Use ReflectionOps to implement these methods.
+ LITE_RUNTIME = 3; // Generate code using MessageLite and the lite runtime.
+ }
+ optional OptimizeMode optimize_for = 9 [default = SPEED];
+
+ // Sets the Go package where structs generated from this .proto will be
+ // placed. If omitted, the Go package will be derived from the following:
+ // - The basename of the package import path, if provided.
+ // - Otherwise, the package statement in the .proto file, if present.
+ // - Otherwise, the basename of the .proto file, without extension.
+ optional string go_package = 11;
+
+ // Should generic services be generated in each language? "Generic" services
+ // are not specific to any particular RPC system. They are generated by the
+ // main code generators in each language (without additional plugins).
+ // Generic services were the only kind of service generation supported by
+ // early versions of google.protobuf.
+ //
+ // Generic services are now considered deprecated in favor of using plugins
+ // that generate code specific to your particular RPC system. Therefore,
+ // these default to false. Old code which depends on generic services should
+ // explicitly set them to true.
+ optional bool cc_generic_services = 16 [default = false];
+ optional bool java_generic_services = 17 [default = false];
+ optional bool py_generic_services = 18 [default = false];
+ reserved 42; // removed php_generic_services
+ reserved "php_generic_services";
+
+ // Is this file deprecated?
+ // Depending on the target platform, this can emit Deprecated annotations
+ // for everything in the file, or it will be completely ignored; in the very
+ // least, this is a formalization for deprecating files.
+ optional bool deprecated = 23 [default = false];
+
+ // Enables the use of arenas for the proto messages in this file. This applies
+ // only to generated classes for C++.
+ optional bool cc_enable_arenas = 31 [default = true];
+
+ // Sets the objective c class prefix which is prepended to all objective c
+ // generated classes from this .proto. There is no default.
+ optional string objc_class_prefix = 36;
+
+ // Namespace for generated classes; defaults to the package.
+ optional string csharp_namespace = 37;
+
+ // By default Swift generators will take the proto package and CamelCase it
+ // replacing '.' with underscore and use that to prefix the types/symbols
+ // defined. When this options is provided, they will use this value instead
+ // to prefix the types/symbols defined.
+ optional string swift_prefix = 39;
+
+ // Sets the php class prefix which is prepended to all php generated classes
+ // from this .proto. Default is empty.
+ optional string php_class_prefix = 40;
+
+ // Use this option to change the namespace of php generated classes. Default
+ // is empty. When this option is empty, the package name will be used for
+ // determining the namespace.
+ optional string php_namespace = 41;
+
+ // Use this option to change the namespace of php generated metadata classes.
+ // Default is empty. When this option is empty, the proto file name will be
+ // used for determining the namespace.
+ optional string php_metadata_namespace = 44;
+
+ // Use this option to change the package of ruby generated classes. Default
+ // is empty. When this option is not set, the package name will be used for
+ // determining the ruby package.
+ optional string ruby_package = 45;
+
+ // Any features defined in the specific edition.
+ // WARNING: This field should only be used by protobuf plugins or special
+ // cases like the proto compiler. Other uses are discouraged and
+ // developers should rely on the protoreflect APIs for their client language.
+ optional FeatureSet features = 50;
+
+ // The parser stores options it doesn't recognize here.
+ // See the documentation for the "Options" section above.
+ repeated UninterpretedOption uninterpreted_option = 999;
+
+ // Clients can define custom options in extensions of this message.
+ // See the documentation for the "Options" section above.
+ extensions 1000 to max;
+
+ reserved 38;
+}
+
+message MessageOptions {
+ // Set true to use the old proto1 MessageSet wire format for extensions.
+ // This is provided for backwards-compatibility with the MessageSet wire
+ // format. You should not use this for any other reason: It's less
+ // efficient, has fewer features, and is more complicated.
+ //
+ // The message must be defined exactly as follows:
+ // message Foo {
+ // option message_set_wire_format = true;
+ // extensions 4 to max;
+ // }
+ // Note that the message cannot have any defined fields; MessageSets only
+ // have extensions.
+ //
+ // All extensions of your type must be singular messages; e.g. they cannot
+ // be int32s, enums, or repeated messages.
+ //
+ // Because this is an option, the above two restrictions are not enforced by
+ // the protocol compiler.
+ optional bool message_set_wire_format = 1 [default = false];
+
+ // Disables the generation of the standard "descriptor()" accessor, which can
+ // conflict with a field of the same name. This is meant to make migration
+ // from proto1 easier; new code should avoid fields named "descriptor".
+ optional bool no_standard_descriptor_accessor = 2 [default = false];
+
+ // Is this message deprecated?
+ // Depending on the target platform, this can emit Deprecated annotations
+ // for the message, or it will be completely ignored; in the very least,
+ // this is a formalization for deprecating messages.
+ optional bool deprecated = 3 [default = false];
+
+ reserved 4, 5, 6;
+
+ // Whether the message is an automatically generated map entry type for the
+ // maps field.
+ //
+ // For maps fields:
+ // map map_field = 1;
+ // The parsed descriptor looks like:
+ // message MapFieldEntry {
+ // option map_entry = true;
+ // optional KeyType key = 1;
+ // optional ValueType value = 2;
+ // }
+ // repeated MapFieldEntry map_field = 1;
+ //
+ // Implementations may choose not to generate the map_entry=true message, but
+ // use a native map in the target language to hold the keys and values.
+ // The reflection APIs in such implementations still need to work as
+ // if the field is a repeated message field.
+ //
+ // NOTE: Do not set the option in .proto files. Always use the maps syntax
+ // instead. The option should only be implicitly set by the proto compiler
+ // parser.
+ optional bool map_entry = 7;
+
+ reserved 8; // javalite_serializable
+ reserved 9; // javanano_as_lite
+
+ // Enable the legacy handling of JSON field name conflicts. This lowercases
+ // and strips underscored from the fields before comparison in proto3 only.
+ // The new behavior takes `json_name` into account and applies to proto2 as
+ // well.
+ //
+ // This should only be used as a temporary measure against broken builds due
+ // to the change in behavior for JSON field name conflicts.
+ //
+ // TODO This is legacy behavior we plan to remove once downstream
+ // teams have had time to migrate.
+ optional bool deprecated_legacy_json_field_conflicts = 11 [deprecated = true];
+
+ // Any features defined in the specific edition.
+ // WARNING: This field should only be used by protobuf plugins or special
+ // cases like the proto compiler. Other uses are discouraged and
+ // developers should rely on the protoreflect APIs for their client language.
+ optional FeatureSet features = 12;
+
+ // The parser stores options it doesn't recognize here. See above.
+ repeated UninterpretedOption uninterpreted_option = 999;
+
+ // Clients can define custom options in extensions of this message. See above.
+ extensions 1000 to max;
+}
+
+message FieldOptions {
+ // NOTE: ctype is deprecated. Use `features.(pb.cpp).string_type` instead.
+ // The ctype option instructs the C++ code generator to use a different
+ // representation of the field than it normally would. See the specific
+ // options below. This option is only implemented to support use of
+ // [ctype=CORD] and [ctype=STRING] (the default) on non-repeated fields of
+ // type "bytes" in the open source release.
+ // TODO: make ctype actually deprecated.
+ optional CType ctype = 1 [/*deprecated = true,*/ default = STRING];
+ enum CType {
+ // Default mode.
+ STRING = 0;
+
+ // The option [ctype=CORD] may be applied to a non-repeated field of type
+ // "bytes". It indicates that in C++, the data should be stored in a Cord
+ // instead of a string. For very large strings, this may reduce memory
+ // fragmentation. It may also allow better performance when parsing from a
+ // Cord, or when parsing with aliasing enabled, as the parsed Cord may then
+ // alias the original buffer.
+ CORD = 1;
+
+ STRING_PIECE = 2;
+ }
+ // The packed option can be enabled for repeated primitive fields to enable
+ // a more efficient representation on the wire. Rather than repeatedly
+ // writing the tag and type for each element, the entire array is encoded as
+ // a single length-delimited blob. In proto3, only explicit setting it to
+ // false will avoid using packed encoding. This option is prohibited in
+ // Editions, but the `repeated_field_encoding` feature can be used to control
+ // the behavior.
+ optional bool packed = 2;
+
+ // The jstype option determines the JavaScript type used for values of the
+ // field. The option is permitted only for 64 bit integral and fixed types
+ // (int64, uint64, sint64, fixed64, sfixed64). A field with jstype JS_STRING
+ // is represented as JavaScript string, which avoids loss of precision that
+ // can happen when a large value is converted to a floating point JavaScript.
+ // Specifying JS_NUMBER for the jstype causes the generated JavaScript code to
+ // use the JavaScript "number" type. The behavior of the default option
+ // JS_NORMAL is implementation dependent.
+ //
+ // This option is an enum to permit additional types to be added, e.g.
+ // goog.math.Integer.
+ optional JSType jstype = 6 [default = JS_NORMAL];
+ enum JSType {
+ // Use the default type.
+ JS_NORMAL = 0;
+
+ // Use JavaScript strings.
+ JS_STRING = 1;
+
+ // Use JavaScript numbers.
+ JS_NUMBER = 2;
+ }
+
+ // Should this field be parsed lazily? Lazy applies only to message-type
+ // fields. It means that when the outer message is initially parsed, the
+ // inner message's contents will not be parsed but instead stored in encoded
+ // form. The inner message will actually be parsed when it is first accessed.
+ //
+ // This is only a hint. Implementations are free to choose whether to use
+ // eager or lazy parsing regardless of the value of this option. However,
+ // setting this option true suggests that the protocol author believes that
+ // using lazy parsing on this field is worth the additional bookkeeping
+ // overhead typically needed to implement it.
+ //
+ // This option does not affect the public interface of any generated code;
+ // all method signatures remain the same. Furthermore, thread-safety of the
+ // interface is not affected by this option; const methods remain safe to
+ // call from multiple threads concurrently, while non-const methods continue
+ // to require exclusive access.
+ //
+ // Note that lazy message fields are still eagerly verified to check
+ // ill-formed wireformat or missing required fields. Calling IsInitialized()
+ // on the outer message would fail if the inner message has missing required
+ // fields. Failed verification would result in parsing failure (except when
+ // uninitialized messages are acceptable).
+ optional bool lazy = 5 [default = false];
+
+ // unverified_lazy does no correctness checks on the byte stream. This should
+ // only be used where lazy with verification is prohibitive for performance
+ // reasons.
+ optional bool unverified_lazy = 15 [default = false];
+
+ // Is this field deprecated?
+ // Depending on the target platform, this can emit Deprecated annotations
+ // for accessors, or it will be completely ignored; in the very least, this
+ // is a formalization for deprecating fields.
+ optional bool deprecated = 3 [default = false];
+
+ // For Google-internal migration only. Do not use.
+ optional bool weak = 10 [default = false];
+
+ // Indicate that the field value should not be printed out when using debug
+ // formats, e.g. when the field contains sensitive credentials.
+ optional bool debug_redact = 16 [default = false];
+
+ // If set to RETENTION_SOURCE, the option will be omitted from the binary.
+ enum OptionRetention {
+ RETENTION_UNKNOWN = 0;
+ RETENTION_RUNTIME = 1;
+ RETENTION_SOURCE = 2;
+ }
+
+ optional OptionRetention retention = 17;
+
+ // This indicates the types of entities that the field may apply to when used
+ // as an option. If it is unset, then the field may be freely used as an
+ // option on any kind of entity.
+ enum OptionTargetType {
+ TARGET_TYPE_UNKNOWN = 0;
+ TARGET_TYPE_FILE = 1;
+ TARGET_TYPE_EXTENSION_RANGE = 2;
+ TARGET_TYPE_MESSAGE = 3;
+ TARGET_TYPE_FIELD = 4;
+ TARGET_TYPE_ONEOF = 5;
+ TARGET_TYPE_ENUM = 6;
+ TARGET_TYPE_ENUM_ENTRY = 7;
+ TARGET_TYPE_SERVICE = 8;
+ TARGET_TYPE_METHOD = 9;
+ }
+
+ repeated OptionTargetType targets = 19;
+
+ message EditionDefault {
+ optional Edition edition = 3;
+ optional string value = 2; // Textproto value.
+ }
+ repeated EditionDefault edition_defaults = 20;
+
+ // Any features defined in the specific edition.
+ // WARNING: This field should only be used by protobuf plugins or special
+ // cases like the proto compiler. Other uses are discouraged and
+ // developers should rely on the protoreflect APIs for their client language.
+ optional FeatureSet features = 21;
+
+ // Information about the support window of a feature.
+ message FeatureSupport {
+ // The edition that this feature was first available in. In editions
+ // earlier than this one, the default assigned to EDITION_LEGACY will be
+ // used, and proto files will not be able to override it.
+ optional Edition edition_introduced = 1;
+
+ // The edition this feature becomes deprecated in. Using this after this
+ // edition may trigger warnings.
+ optional Edition edition_deprecated = 2;
+
+ // The deprecation warning text if this feature is used after the edition it
+ // was marked deprecated in.
+ optional string deprecation_warning = 3;
+
+ // The edition this feature is no longer available in. In editions after
+ // this one, the last default assigned will be used, and proto files will
+ // not be able to override it.
+ optional Edition edition_removed = 4;
+ }
+ optional FeatureSupport feature_support = 22;
+
+ // The parser stores options it doesn't recognize here. See above.
+ repeated UninterpretedOption uninterpreted_option = 999;
+
+ // Clients can define custom options in extensions of this message. See above.
+ extensions 1000 to max;
+
+ reserved 4; // removed jtype
+ reserved 18; // reserve target, target_obsolete_do_not_use
+}
+
+message OneofOptions {
+ // Any features defined in the specific edition.
+ // WARNING: This field should only be used by protobuf plugins or special
+ // cases like the proto compiler. Other uses are discouraged and
+ // developers should rely on the protoreflect APIs for their client language.
+ optional FeatureSet features = 1;
+
+ // The parser stores options it doesn't recognize here. See above.
+ repeated UninterpretedOption uninterpreted_option = 999;
+
+ // Clients can define custom options in extensions of this message. See above.
+ extensions 1000 to max;
+}
+
+message EnumOptions {
+
+ // Set this option to true to allow mapping different tag names to the same
+ // value.
+ optional bool allow_alias = 2;
+
+ // Is this enum deprecated?
+ // Depending on the target platform, this can emit Deprecated annotations
+ // for the enum, or it will be completely ignored; in the very least, this
+ // is a formalization for deprecating enums.
+ optional bool deprecated = 3 [default = false];
+
+ reserved 5; // javanano_as_lite
+
+ // Enable the legacy handling of JSON field name conflicts. This lowercases
+ // and strips underscored from the fields before comparison in proto3 only.
+ // The new behavior takes `json_name` into account and applies to proto2 as
+ // well.
+ // TODO Remove this legacy behavior once downstream teams have
+ // had time to migrate.
+ optional bool deprecated_legacy_json_field_conflicts = 6 [deprecated = true];
+
+ // Any features defined in the specific edition.
+ // WARNING: This field should only be used by protobuf plugins or special
+ // cases like the proto compiler. Other uses are discouraged and
+ // developers should rely on the protoreflect APIs for their client language.
+ optional FeatureSet features = 7;
+
+ // The parser stores options it doesn't recognize here. See above.
+ repeated UninterpretedOption uninterpreted_option = 999;
+
+ // Clients can define custom options in extensions of this message. See above.
+ extensions 1000 to max;
+}
+
+message EnumValueOptions {
+ // Is this enum value deprecated?
+ // Depending on the target platform, this can emit Deprecated annotations
+ // for the enum value, or it will be completely ignored; in the very least,
+ // this is a formalization for deprecating enum values.
+ optional bool deprecated = 1 [default = false];
+
+ // Any features defined in the specific edition.
+ // WARNING: This field should only be used by protobuf plugins or special
+ // cases like the proto compiler. Other uses are discouraged and
+ // developers should rely on the protoreflect APIs for their client language.
+ optional FeatureSet features = 2;
+
+ // Indicate that fields annotated with this enum value should not be printed
+ // out when using debug formats, e.g. when the field contains sensitive
+ // credentials.
+ optional bool debug_redact = 3 [default = false];
+
+ // Information about the support window of a feature value.
+ optional FieldOptions.FeatureSupport feature_support = 4;
+
+ // The parser stores options it doesn't recognize here. See above.
+ repeated UninterpretedOption uninterpreted_option = 999;
+
+ // Clients can define custom options in extensions of this message. See above.
+ extensions 1000 to max;
+}
+
+message ServiceOptions {
+
+ // Any features defined in the specific edition.
+ // WARNING: This field should only be used by protobuf plugins or special
+ // cases like the proto compiler. Other uses are discouraged and
+ // developers should rely on the protoreflect APIs for their client language.
+ optional FeatureSet features = 34;
+
+ // Note: Field numbers 1 through 32 are reserved for Google's internal RPC
+ // framework. We apologize for hoarding these numbers to ourselves, but
+ // we were already using them long before we decided to release Protocol
+ // Buffers.
+
+ // Is this service deprecated?
+ // Depending on the target platform, this can emit Deprecated annotations
+ // for the service, or it will be completely ignored; in the very least,
+ // this is a formalization for deprecating services.
+ optional bool deprecated = 33 [default = false];
+
+ // The parser stores options it doesn't recognize here. See above.
+ repeated UninterpretedOption uninterpreted_option = 999;
+
+ // Clients can define custom options in extensions of this message. See above.
+ extensions 1000 to max;
+}
+
+message MethodOptions {
+
+ // Note: Field numbers 1 through 32 are reserved for Google's internal RPC
+ // framework. We apologize for hoarding these numbers to ourselves, but
+ // we were already using them long before we decided to release Protocol
+ // Buffers.
+
+ // Is this method deprecated?
+ // Depending on the target platform, this can emit Deprecated annotations
+ // for the method, or it will be completely ignored; in the very least,
+ // this is a formalization for deprecating methods.
+ optional bool deprecated = 33 [default = false];
+
+ // Is this method side-effect-free (or safe in HTTP parlance), or idempotent,
+ // or neither? HTTP based RPC implementation may choose GET verb for safe
+ // methods, and PUT verb for idempotent methods instead of the default POST.
+ enum IdempotencyLevel {
+ IDEMPOTENCY_UNKNOWN = 0;
+ NO_SIDE_EFFECTS = 1; // implies idempotent
+ IDEMPOTENT = 2; // idempotent, but may have side effects
+ }
+ optional IdempotencyLevel idempotency_level = 34
+ [default = IDEMPOTENCY_UNKNOWN];
+
+ // Any features defined in the specific edition.
+ // WARNING: This field should only be used by protobuf plugins or special
+ // cases like the proto compiler. Other uses are discouraged and
+ // developers should rely on the protoreflect APIs for their client language.
+ optional FeatureSet features = 35;
+
+ // The parser stores options it doesn't recognize here. See above.
+ repeated UninterpretedOption uninterpreted_option = 999;
+
+ // Clients can define custom options in extensions of this message. See above.
+ extensions 1000 to max;
+}
+
+// A message representing a option the parser does not recognize. This only
+// appears in options protos created by the compiler::Parser class.
+// DescriptorPool resolves these when building Descriptor objects. Therefore,
+// options protos in descriptor objects (e.g. returned by Descriptor::options(),
+// or produced by Descriptor::CopyTo()) will never have UninterpretedOptions
+// in them.
+message UninterpretedOption {
+ // The name of the uninterpreted option. Each string represents a segment in
+ // a dot-separated name. is_extension is true iff a segment represents an
+ // extension (denoted with parentheses in options specs in .proto files).
+ // E.g.,{ ["foo", false], ["bar.baz", true], ["moo", false] } represents
+ // "foo.(bar.baz).moo".
+ message NamePart {
+ required string name_part = 1;
+ required bool is_extension = 2;
+ }
+ repeated NamePart name = 2;
+
+ // The value of the uninterpreted option, in whatever type the tokenizer
+ // identified it as during parsing. Exactly one of these should be set.
+ optional string identifier_value = 3;
+ optional uint64 positive_int_value = 4;
+ optional int64 negative_int_value = 5;
+ optional double double_value = 6;
+ optional bytes string_value = 7;
+ optional string aggregate_value = 8;
+}
+
+// ===================================================================
+// Features
+
+// TODO Enums in C++ gencode (and potentially other languages) are
+// not well scoped. This means that each of the feature enums below can clash
+// with each other. The short names we've chosen maximize call-site
+// readability, but leave us very open to this scenario. A future feature will
+// be designed and implemented to handle this, hopefully before we ever hit a
+// conflict here.
+message FeatureSet {
+ enum FieldPresence {
+ FIELD_PRESENCE_UNKNOWN = 0;
+ EXPLICIT = 1;
+ IMPLICIT = 2;
+ LEGACY_REQUIRED = 3;
+ }
+ optional FieldPresence field_presence = 1 [
+ retention = RETENTION_RUNTIME,
+ targets = TARGET_TYPE_FIELD,
+ targets = TARGET_TYPE_FILE,
+ feature_support = {
+ edition_introduced: EDITION_2023,
+ },
+ edition_defaults = { edition: EDITION_LEGACY, value: "EXPLICIT" },
+ edition_defaults = { edition: EDITION_PROTO3, value: "IMPLICIT" },
+ edition_defaults = { edition: EDITION_2023, value: "EXPLICIT" }
+ ];
+
+ enum EnumType {
+ ENUM_TYPE_UNKNOWN = 0;
+ OPEN = 1;
+ CLOSED = 2;
+ }
+ optional EnumType enum_type = 2 [
+ retention = RETENTION_RUNTIME,
+ targets = TARGET_TYPE_ENUM,
+ targets = TARGET_TYPE_FILE,
+ feature_support = {
+ edition_introduced: EDITION_2023,
+ },
+ edition_defaults = { edition: EDITION_LEGACY, value: "CLOSED" },
+ edition_defaults = { edition: EDITION_PROTO3, value: "OPEN" }
+ ];
+
+ enum RepeatedFieldEncoding {
+ REPEATED_FIELD_ENCODING_UNKNOWN = 0;
+ PACKED = 1;
+ EXPANDED = 2;
+ }
+ optional RepeatedFieldEncoding repeated_field_encoding = 3 [
+ retention = RETENTION_RUNTIME,
+ targets = TARGET_TYPE_FIELD,
+ targets = TARGET_TYPE_FILE,
+ feature_support = {
+ edition_introduced: EDITION_2023,
+ },
+ edition_defaults = { edition: EDITION_LEGACY, value: "EXPANDED" },
+ edition_defaults = { edition: EDITION_PROTO3, value: "PACKED" }
+ ];
+
+ enum Utf8Validation {
+ UTF8_VALIDATION_UNKNOWN = 0;
+ VERIFY = 2;
+ NONE = 3;
+ reserved 1;
+ }
+ optional Utf8Validation utf8_validation = 4 [
+ retention = RETENTION_RUNTIME,
+ targets = TARGET_TYPE_FIELD,
+ targets = TARGET_TYPE_FILE,
+ feature_support = {
+ edition_introduced: EDITION_2023,
+ },
+ edition_defaults = { edition: EDITION_LEGACY, value: "NONE" },
+ edition_defaults = { edition: EDITION_PROTO3, value: "VERIFY" }
+ ];
+
+ enum MessageEncoding {
+ MESSAGE_ENCODING_UNKNOWN = 0;
+ LENGTH_PREFIXED = 1;
+ DELIMITED = 2;
+ }
+ optional MessageEncoding message_encoding = 5 [
+ retention = RETENTION_RUNTIME,
+ targets = TARGET_TYPE_FIELD,
+ targets = TARGET_TYPE_FILE,
+ feature_support = {
+ edition_introduced: EDITION_2023,
+ },
+ edition_defaults = { edition: EDITION_LEGACY, value: "LENGTH_PREFIXED" }
+ ];
+
+ enum JsonFormat {
+ JSON_FORMAT_UNKNOWN = 0;
+ ALLOW = 1;
+ LEGACY_BEST_EFFORT = 2;
+ }
+ optional JsonFormat json_format = 6 [
+ retention = RETENTION_RUNTIME,
+ targets = TARGET_TYPE_MESSAGE,
+ targets = TARGET_TYPE_ENUM,
+ targets = TARGET_TYPE_FILE,
+ feature_support = {
+ edition_introduced: EDITION_2023,
+ },
+ edition_defaults = { edition: EDITION_LEGACY, value: "LEGACY_BEST_EFFORT" },
+ edition_defaults = { edition: EDITION_PROTO3, value: "ALLOW" }
+ ];
+
+ enum EnforceNamingStyle {
+ ENFORCE_NAMING_STYLE_UNKNOWN = 0;
+ STYLE2024 = 1;
+ STYLE_LEGACY = 2;
+ }
+ optional EnforceNamingStyle enforce_naming_style = 7 [
+ retention = RETENTION_SOURCE,
+ targets = TARGET_TYPE_FILE,
+ targets = TARGET_TYPE_EXTENSION_RANGE,
+ targets = TARGET_TYPE_MESSAGE,
+ targets = TARGET_TYPE_FIELD,
+ targets = TARGET_TYPE_ONEOF,
+ targets = TARGET_TYPE_ENUM,
+ targets = TARGET_TYPE_ENUM_ENTRY,
+ targets = TARGET_TYPE_SERVICE,
+ targets = TARGET_TYPE_METHOD,
+ feature_support = {
+ edition_introduced: EDITION_2024,
+ },
+ edition_defaults = { edition: EDITION_LEGACY, value: "STYLE_LEGACY" },
+ edition_defaults = { edition: EDITION_2024, value: "STYLE2024" }
+ ];
+
+ reserved 999;
+
+ extensions 1000 to 9994 [
+ declaration = {
+ number: 1000,
+ full_name: ".pb.cpp",
+ type: ".pb.CppFeatures"
+ },
+ declaration = {
+ number: 1001,
+ full_name: ".pb.java",
+ type: ".pb.JavaFeatures"
+ },
+ declaration = { number: 1002, full_name: ".pb.go", type: ".pb.GoFeatures" },
+ declaration = {
+ number: 1003,
+ full_name: ".pb.python",
+ type: ".pb.PythonFeatures"
+ },
+ declaration = {
+ number: 9990,
+ full_name: ".pb.proto1",
+ type: ".pb.Proto1Features"
+ }
+ ];
+
+ extensions 9995 to 9999; // For internal testing
+ extensions 10000; // for https://github.com/bufbuild/protobuf-es
+}
+
+// A compiled specification for the defaults of a set of features. These
+// messages are generated from FeatureSet extensions and can be used to seed
+// feature resolution. The resolution with this object becomes a simple search
+// for the closest matching edition, followed by proto merges.
+message FeatureSetDefaults {
+ // A map from every known edition with a unique set of defaults to its
+ // defaults. Not all editions may be contained here. For a given edition,
+ // the defaults at the closest matching edition ordered at or before it should
+ // be used. This field must be in strict ascending order by edition.
+ message FeatureSetEditionDefault {
+ optional Edition edition = 3;
+
+ // Defaults of features that can be overridden in this edition.
+ optional FeatureSet overridable_features = 4;
+
+ // Defaults of features that can't be overridden in this edition.
+ optional FeatureSet fixed_features = 5;
+
+ reserved 1, 2;
+ reserved "features";
+ }
+ repeated FeatureSetEditionDefault defaults = 1;
+
+ // The minimum supported edition (inclusive) when this was constructed.
+ // Editions before this will not have defaults.
+ optional Edition minimum_edition = 4;
+
+ // The maximum known edition (inclusive) when this was constructed. Editions
+ // after this will not have reliable defaults.
+ optional Edition maximum_edition = 5;
+}
+
+// ===================================================================
+// Optional source code info
+
+// Encapsulates information about the original source file from which a
+// FileDescriptorProto was generated.
+message SourceCodeInfo {
+ // A Location identifies a piece of source code in a .proto file which
+ // corresponds to a particular definition. This information is intended
+ // to be useful to IDEs, code indexers, documentation generators, and similar
+ // tools.
+ //
+ // For example, say we have a file like:
+ // message Foo {
+ // optional string foo = 1;
+ // }
+ // Let's look at just the field definition:
+ // optional string foo = 1;
+ // ^ ^^ ^^ ^ ^^^
+ // a bc de f ghi
+ // We have the following locations:
+ // span path represents
+ // [a,i) [ 4, 0, 2, 0 ] The whole field definition.
+ // [a,b) [ 4, 0, 2, 0, 4 ] The label (optional).
+ // [c,d) [ 4, 0, 2, 0, 5 ] The type (string).
+ // [e,f) [ 4, 0, 2, 0, 1 ] The name (foo).
+ // [g,h) [ 4, 0, 2, 0, 3 ] The number (1).
+ //
+ // Notes:
+ // - A location may refer to a repeated field itself (i.e. not to any
+ // particular index within it). This is used whenever a set of elements are
+ // logically enclosed in a single code segment. For example, an entire
+ // extend block (possibly containing multiple extension definitions) will
+ // have an outer location whose path refers to the "extensions" repeated
+ // field without an index.
+ // - Multiple locations may have the same path. This happens when a single
+ // logical declaration is spread out across multiple places. The most
+ // obvious example is the "extend" block again -- there may be multiple
+ // extend blocks in the same scope, each of which will have the same path.
+ // - A location's span is not always a subset of its parent's span. For
+ // example, the "extendee" of an extension declaration appears at the
+ // beginning of the "extend" block and is shared by all extensions within
+ // the block.
+ // - Just because a location's span is a subset of some other location's span
+ // does not mean that it is a descendant. For example, a "group" defines
+ // both a type and a field in a single declaration. Thus, the locations
+ // corresponding to the type and field and their components will overlap.
+ // - Code which tries to interpret locations should probably be designed to
+ // ignore those that it doesn't understand, as more types of locations could
+ // be recorded in the future.
+ repeated Location location = 1;
+ message Location {
+ // Identifies which part of the FileDescriptorProto was defined at this
+ // location.
+ //
+ // Each element is a field number or an index. They form a path from
+ // the root FileDescriptorProto to the place where the definition appears.
+ // For example, this path:
+ // [ 4, 3, 2, 7, 1 ]
+ // refers to:
+ // file.message_type(3) // 4, 3
+ // .field(7) // 2, 7
+ // .name() // 1
+ // This is because FileDescriptorProto.message_type has field number 4:
+ // repeated DescriptorProto message_type = 4;
+ // and DescriptorProto.field has field number 2:
+ // repeated FieldDescriptorProto field = 2;
+ // and FieldDescriptorProto.name has field number 1:
+ // optional string name = 1;
+ //
+ // Thus, the above path gives the location of a field name. If we removed
+ // the last element:
+ // [ 4, 3, 2, 7 ]
+ // this path refers to the whole field declaration (from the beginning
+ // of the label to the terminating semicolon).
+ repeated int32 path = 1 [packed = true];
+
+ // Always has exactly three or four elements: start line, start column,
+ // end line (optional, otherwise assumed same as start line), end column.
+ // These are packed into a single field for efficiency. Note that line
+ // and column numbers are zero-based -- typically you will want to add
+ // 1 to each before displaying to a user.
+ repeated int32 span = 2 [packed = true];
+
+ // If this SourceCodeInfo represents a complete declaration, these are any
+ // comments appearing before and after the declaration which appear to be
+ // attached to the declaration.
+ //
+ // A series of line comments appearing on consecutive lines, with no other
+ // tokens appearing on those lines, will be treated as a single comment.
+ //
+ // leading_detached_comments will keep paragraphs of comments that appear
+ // before (but not connected to) the current element. Each paragraph,
+ // separated by empty lines, will be one comment element in the repeated
+ // field.
+ //
+ // Only the comment content is provided; comment markers (e.g. //) are
+ // stripped out. For block comments, leading whitespace and an asterisk
+ // will be stripped from the beginning of each line other than the first.
+ // Newlines are included in the output.
+ //
+ // Examples:
+ //
+ // optional int32 foo = 1; // Comment attached to foo.
+ // // Comment attached to bar.
+ // optional int32 bar = 2;
+ //
+ // optional string baz = 3;
+ // // Comment attached to baz.
+ // // Another line attached to baz.
+ //
+ // // Comment attached to moo.
+ // //
+ // // Another line attached to moo.
+ // optional double moo = 4;
+ //
+ // // Detached comment for corge. This is not leading or trailing comments
+ // // to moo or corge because there are blank lines separating it from
+ // // both.
+ //
+ // // Detached comment for corge paragraph 2.
+ //
+ // optional string corge = 5;
+ // /* Block comment attached
+ // * to corge. Leading asterisks
+ // * will be removed. */
+ // /* Block comment attached to
+ // * grault. */
+ // optional int32 grault = 6;
+ //
+ // // ignored detached comments.
+ optional string leading_comments = 3;
+ optional string trailing_comments = 4;
+ repeated string leading_detached_comments = 6;
+ }
+
+ // Extensions for tooling.
+ extensions 536000000 [declaration = {
+ number: 536000000
+ type: ".buf.descriptor.v1.SourceCodeInfoExtension"
+ full_name: ".buf.descriptor.v1.buf_source_code_info_extension"
+ }];
+}
+
+// Describes the relationship between generated code and its original source
+// file. A GeneratedCodeInfo message is associated with only one generated
+// source file, but may contain references to different source .proto files.
+message GeneratedCodeInfo {
+ // An Annotation connects some span of text in generated code to an element
+ // of its generating .proto file.
+ repeated Annotation annotation = 1;
+ message Annotation {
+ // Identifies the element in the original source .proto file. This field
+ // is formatted the same as SourceCodeInfo.Location.path.
+ repeated int32 path = 1 [packed = true];
+
+ // Identifies the filesystem path to the original source .proto.
+ optional string source_file = 2;
+
+ // Identifies the starting offset in bytes in the generated code
+ // that relates to the identified object.
+ optional int32 begin = 3;
+
+ // Identifies the ending offset in bytes in the generated code that
+ // relates to the identified object. The end offset should be one past
+ // the last relevant byte (so the length of the text = end - begin).
+ optional int32 end = 4;
+
+ // Represents the identified object's effect on the element in the original
+ // .proto file.
+ enum Semantic {
+ // There is no effect or the effect is indescribable.
+ NONE = 0;
+ // The element is set or otherwise mutated.
+ SET = 1;
+ // An alias to the element is returned.
+ ALIAS = 2;
+ }
+ optional Semantic semantic = 5;
+ }
+}
diff --git a/Protobuf/ProtobufCompiler/include/google/protobuf/duration.proto b/Protobuf/ProtobufCompiler/include/google/protobuf/duration.proto
new file mode 100644
index 0000000..41f40c2
--- /dev/null
+++ b/Protobuf/ProtobufCompiler/include/google/protobuf/duration.proto
@@ -0,0 +1,115 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+syntax = "proto3";
+
+package google.protobuf;
+
+option cc_enable_arenas = true;
+option go_package = "google.golang.org/protobuf/types/known/durationpb";
+option java_package = "com.google.protobuf";
+option java_outer_classname = "DurationProto";
+option java_multiple_files = true;
+option objc_class_prefix = "GPB";
+option csharp_namespace = "Google.Protobuf.WellKnownTypes";
+
+// A Duration represents a signed, fixed-length span of time represented
+// as a count of seconds and fractions of seconds at nanosecond
+// resolution. It is independent of any calendar and concepts like "day"
+// or "month". It is related to Timestamp in that the difference between
+// two Timestamp values is a Duration and it can be added or subtracted
+// from a Timestamp. Range is approximately +-10,000 years.
+//
+// # Examples
+//
+// Example 1: Compute Duration from two Timestamps in pseudo code.
+//
+// Timestamp start = ...;
+// Timestamp end = ...;
+// Duration duration = ...;
+//
+// duration.seconds = end.seconds - start.seconds;
+// duration.nanos = end.nanos - start.nanos;
+//
+// if (duration.seconds < 0 && duration.nanos > 0) {
+// duration.seconds += 1;
+// duration.nanos -= 1000000000;
+// } else if (duration.seconds > 0 && duration.nanos < 0) {
+// duration.seconds -= 1;
+// duration.nanos += 1000000000;
+// }
+//
+// Example 2: Compute Timestamp from Timestamp + Duration in pseudo code.
+//
+// Timestamp start = ...;
+// Duration duration = ...;
+// Timestamp end = ...;
+//
+// end.seconds = start.seconds + duration.seconds;
+// end.nanos = start.nanos + duration.nanos;
+//
+// if (end.nanos < 0) {
+// end.seconds -= 1;
+// end.nanos += 1000000000;
+// } else if (end.nanos >= 1000000000) {
+// end.seconds += 1;
+// end.nanos -= 1000000000;
+// }
+//
+// Example 3: Compute Duration from datetime.timedelta in Python.
+//
+// td = datetime.timedelta(days=3, minutes=10)
+// duration = Duration()
+// duration.FromTimedelta(td)
+//
+// # JSON Mapping
+//
+// In JSON format, the Duration type is encoded as a string rather than an
+// object, where the string ends in the suffix "s" (indicating seconds) and
+// is preceded by the number of seconds, with nanoseconds expressed as
+// fractional seconds. For example, 3 seconds with 0 nanoseconds should be
+// encoded in JSON format as "3s", while 3 seconds and 1 nanosecond should
+// be expressed in JSON format as "3.000000001s", and 3 seconds and 1
+// microsecond should be expressed in JSON format as "3.000001s".
+//
+message Duration {
+ // Signed seconds of the span of time. Must be from -315,576,000,000
+ // to +315,576,000,000 inclusive. Note: these bounds are computed from:
+ // 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
+ int64 seconds = 1;
+
+ // Signed fractions of a second at nanosecond resolution of the span
+ // of time. Durations less than one second are represented with a 0
+ // `seconds` field and a positive or negative `nanos` field. For durations
+ // of one second or more, a non-zero value for the `nanos` field must be
+ // of the same sign as the `seconds` field. Must be from -999,999,999
+ // to +999,999,999 inclusive.
+ int32 nanos = 2;
+}
diff --git a/Protobuf/ProtobufCompiler/include/google/protobuf/empty.proto b/Protobuf/ProtobufCompiler/include/google/protobuf/empty.proto
new file mode 100644
index 0000000..b87c89d
--- /dev/null
+++ b/Protobuf/ProtobufCompiler/include/google/protobuf/empty.proto
@@ -0,0 +1,51 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+syntax = "proto3";
+
+package google.protobuf;
+
+option go_package = "google.golang.org/protobuf/types/known/emptypb";
+option java_package = "com.google.protobuf";
+option java_outer_classname = "EmptyProto";
+option java_multiple_files = true;
+option objc_class_prefix = "GPB";
+option csharp_namespace = "Google.Protobuf.WellKnownTypes";
+option cc_enable_arenas = true;
+
+// A generic empty message that you can re-use to avoid defining duplicated
+// empty messages in your APIs. A typical example is to use it as the request
+// or the response type of an API method. For instance:
+//
+// service Foo {
+// rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
+// }
+//
+message Empty {}
diff --git a/Protobuf/ProtobufCompiler/include/google/protobuf/field_mask.proto b/Protobuf/ProtobufCompiler/include/google/protobuf/field_mask.proto
new file mode 100644
index 0000000..b28334b
--- /dev/null
+++ b/Protobuf/ProtobufCompiler/include/google/protobuf/field_mask.proto
@@ -0,0 +1,245 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+syntax = "proto3";
+
+package google.protobuf;
+
+option java_package = "com.google.protobuf";
+option java_outer_classname = "FieldMaskProto";
+option java_multiple_files = true;
+option objc_class_prefix = "GPB";
+option csharp_namespace = "Google.Protobuf.WellKnownTypes";
+option go_package = "google.golang.org/protobuf/types/known/fieldmaskpb";
+option cc_enable_arenas = true;
+
+// `FieldMask` represents a set of symbolic field paths, for example:
+//
+// paths: "f.a"
+// paths: "f.b.d"
+//
+// Here `f` represents a field in some root message, `a` and `b`
+// fields in the message found in `f`, and `d` a field found in the
+// message in `f.b`.
+//
+// Field masks are used to specify a subset of fields that should be
+// returned by a get operation or modified by an update operation.
+// Field masks also have a custom JSON encoding (see below).
+//
+// # Field Masks in Projections
+//
+// When used in the context of a projection, a response message or
+// sub-message is filtered by the API to only contain those fields as
+// specified in the mask. For example, if the mask in the previous
+// example is applied to a response message as follows:
+//
+// f {
+// a : 22
+// b {
+// d : 1
+// x : 2
+// }
+// y : 13
+// }
+// z: 8
+//
+// The result will not contain specific values for fields x,y and z
+// (their value will be set to the default, and omitted in proto text
+// output):
+//
+//
+// f {
+// a : 22
+// b {
+// d : 1
+// }
+// }
+//
+// A repeated field is not allowed except at the last position of a
+// paths string.
+//
+// If a FieldMask object is not present in a get operation, the
+// operation applies to all fields (as if a FieldMask of all fields
+// had been specified).
+//
+// Note that a field mask does not necessarily apply to the
+// top-level response message. In case of a REST get operation, the
+// field mask applies directly to the response, but in case of a REST
+// list operation, the mask instead applies to each individual message
+// in the returned resource list. In case of a REST custom method,
+// other definitions may be used. Where the mask applies will be
+// clearly documented together with its declaration in the API. In
+// any case, the effect on the returned resource/resources is required
+// behavior for APIs.
+//
+// # Field Masks in Update Operations
+//
+// A field mask in update operations specifies which fields of the
+// targeted resource are going to be updated. The API is required
+// to only change the values of the fields as specified in the mask
+// and leave the others untouched. If a resource is passed in to
+// describe the updated values, the API ignores the values of all
+// fields not covered by the mask.
+//
+// If a repeated field is specified for an update operation, new values will
+// be appended to the existing repeated field in the target resource. Note that
+// a repeated field is only allowed in the last position of a `paths` string.
+//
+// If a sub-message is specified in the last position of the field mask for an
+// update operation, then new value will be merged into the existing sub-message
+// in the target resource.
+//
+// For example, given the target message:
+//
+// f {
+// b {
+// d: 1
+// x: 2
+// }
+// c: [1]
+// }
+//
+// And an update message:
+//
+// f {
+// b {
+// d: 10
+// }
+// c: [2]
+// }
+//
+// then if the field mask is:
+//
+// paths: ["f.b", "f.c"]
+//
+// then the result will be:
+//
+// f {
+// b {
+// d: 10
+// x: 2
+// }
+// c: [1, 2]
+// }
+//
+// An implementation may provide options to override this default behavior for
+// repeated and message fields.
+//
+// In order to reset a field's value to the default, the field must
+// be in the mask and set to the default value in the provided resource.
+// Hence, in order to reset all fields of a resource, provide a default
+// instance of the resource and set all fields in the mask, or do
+// not provide a mask as described below.
+//
+// If a field mask is not present on update, the operation applies to
+// all fields (as if a field mask of all fields has been specified).
+// Note that in the presence of schema evolution, this may mean that
+// fields the client does not know and has therefore not filled into
+// the request will be reset to their default. If this is unwanted
+// behavior, a specific service may require a client to always specify
+// a field mask, producing an error if not.
+//
+// As with get operations, the location of the resource which
+// describes the updated values in the request message depends on the
+// operation kind. In any case, the effect of the field mask is
+// required to be honored by the API.
+//
+// ## Considerations for HTTP REST
+//
+// The HTTP kind of an update operation which uses a field mask must
+// be set to PATCH instead of PUT in order to satisfy HTTP semantics
+// (PUT must only be used for full updates).
+//
+// # JSON Encoding of Field Masks
+//
+// In JSON, a field mask is encoded as a single string where paths are
+// separated by a comma. Fields name in each path are converted
+// to/from lower-camel naming conventions.
+//
+// As an example, consider the following message declarations:
+//
+// message Profile {
+// User user = 1;
+// Photo photo = 2;
+// }
+// message User {
+// string display_name = 1;
+// string address = 2;
+// }
+//
+// In proto a field mask for `Profile` may look as such:
+//
+// mask {
+// paths: "user.display_name"
+// paths: "photo"
+// }
+//
+// In JSON, the same mask is represented as below:
+//
+// {
+// mask: "user.displayName,photo"
+// }
+//
+// # Field Masks and Oneof Fields
+//
+// Field masks treat fields in oneofs just as regular fields. Consider the
+// following message:
+//
+// message SampleMessage {
+// oneof test_oneof {
+// string name = 4;
+// SubMessage sub_message = 9;
+// }
+// }
+//
+// The field mask can be:
+//
+// mask {
+// paths: "name"
+// }
+//
+// Or:
+//
+// mask {
+// paths: "sub_message"
+// }
+//
+// Note that oneof type names ("test_oneof" in this case) cannot be used in
+// paths.
+//
+// ## Field Mask Verification
+//
+// The implementation of any API method which has a FieldMask type field in the
+// request should verify the included field paths, and return an
+// `INVALID_ARGUMENT` error if any path is unmappable.
+message FieldMask {
+ // The set of field mask paths.
+ repeated string paths = 1;
+}
diff --git a/Protobuf/ProtobufCompiler/include/google/protobuf/go_features.proto b/Protobuf/ProtobufCompiler/include/google/protobuf/go_features.proto
new file mode 100644
index 0000000..a9cc792
--- /dev/null
+++ b/Protobuf/ProtobufCompiler/include/google/protobuf/go_features.proto
@@ -0,0 +1,80 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2023 Google Inc. All rights reserved.
+//
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file or at
+// https://developers.google.com/open-source/licenses/bsd
+
+syntax = "proto2";
+
+package pb;
+
+import "google/protobuf/descriptor.proto";
+
+option go_package = "google.golang.org/protobuf/types/gofeaturespb";
+
+extend google.protobuf.FeatureSet {
+ optional GoFeatures go = 1002;
+}
+
+message GoFeatures {
+ // Whether or not to generate the deprecated UnmarshalJSON method for enums.
+ // Can only be true for proto using the Open Struct api.
+ optional bool legacy_unmarshal_json_enum = 1 [
+ retention = RETENTION_RUNTIME,
+ targets = TARGET_TYPE_ENUM,
+ targets = TARGET_TYPE_FILE,
+ feature_support = {
+ edition_introduced: EDITION_2023,
+ edition_deprecated: EDITION_2023,
+ deprecation_warning: "The legacy UnmarshalJSON API is deprecated and "
+ "will be removed in a future edition.",
+ },
+ edition_defaults = { edition: EDITION_LEGACY, value: "true" },
+ edition_defaults = { edition: EDITION_PROTO3, value: "false" }
+ ];
+
+ enum APILevel {
+ // API_LEVEL_UNSPECIFIED results in selecting the OPEN API,
+ // but needs to be a separate value to distinguish between
+ // an explicitly set api level or a missing api level.
+ API_LEVEL_UNSPECIFIED = 0;
+ API_OPEN = 1;
+ API_HYBRID = 2;
+ API_OPAQUE = 3;
+ }
+
+ // One of OPEN, HYBRID or OPAQUE.
+ optional APILevel api_level = 2 [
+ retention = RETENTION_RUNTIME,
+ targets = TARGET_TYPE_MESSAGE,
+ targets = TARGET_TYPE_FILE,
+ feature_support = {
+ edition_introduced: EDITION_2023,
+ },
+ edition_defaults = { edition: EDITION_LEGACY, value: "API_LEVEL_UNSPECIFIED" },
+ edition_defaults = { edition: EDITION_2024, value: "API_OPAQUE" }
+ ];
+
+ enum StripEnumPrefix {
+ STRIP_ENUM_PREFIX_UNSPECIFIED = 0;
+ STRIP_ENUM_PREFIX_KEEP = 1;
+ STRIP_ENUM_PREFIX_GENERATE_BOTH = 2;
+ STRIP_ENUM_PREFIX_STRIP = 3;
+ }
+
+ optional StripEnumPrefix strip_enum_prefix = 3 [
+ retention = RETENTION_RUNTIME,
+ targets = TARGET_TYPE_ENUM,
+ targets = TARGET_TYPE_ENUM_ENTRY,
+ targets = TARGET_TYPE_FILE,
+ feature_support = {
+ edition_introduced: EDITION_2024,
+ },
+ // TODO: change the default to STRIP_ENUM_PREFIX_STRIP for edition 2025.
+ edition_defaults = {
+ edition: EDITION_LEGACY,
+ value: "STRIP_ENUM_PREFIX_KEEP"
+ }
+ ];
+}
diff --git a/Protobuf/ProtobufCompiler/include/google/protobuf/java_features.proto b/Protobuf/ProtobufCompiler/include/google/protobuf/java_features.proto
new file mode 100644
index 0000000..3f8ee1a
--- /dev/null
+++ b/Protobuf/ProtobufCompiler/include/google/protobuf/java_features.proto
@@ -0,0 +1,87 @@
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2023 Google Inc. All rights reserved.
+//
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file or at
+// https://developers.google.com/open-source/licenses/bsd
+
+syntax = "proto2";
+
+package pb;
+
+import "google/protobuf/descriptor.proto";
+
+option java_package = "com.google.protobuf";
+option java_outer_classname = "JavaFeaturesProto";
+
+extend google.protobuf.FeatureSet {
+ optional JavaFeatures java = 1001;
+}
+
+message JavaFeatures {
+ // Whether or not to treat an enum field as closed. This option is only
+ // applicable to enum fields, and will be removed in the future. It is
+ // consistent with the legacy behavior of using proto3 enum types for proto2
+ // fields.
+ optional bool legacy_closed_enum = 1 [
+ retention = RETENTION_RUNTIME,
+ targets = TARGET_TYPE_FIELD,
+ targets = TARGET_TYPE_FILE,
+ feature_support = {
+ edition_introduced: EDITION_2023,
+ edition_deprecated: EDITION_2023,
+ deprecation_warning: "The legacy closed enum behavior in Java is "
+ "deprecated and is scheduled to be removed in "
+ "edition 2025. See http://protobuf.dev/programming-guides/enum/#java for "
+ "more information.",
+ },
+ edition_defaults = { edition: EDITION_LEGACY, value: "true" },
+ edition_defaults = { edition: EDITION_PROTO3, value: "false" }
+ ];
+
+ // The UTF8 validation strategy to use. See go/editions-utf8-validation for
+ // more information on this feature.
+ enum Utf8Validation {
+ // Invalid default, which should never be used.
+ UTF8_VALIDATION_UNKNOWN = 0;
+ // Respect the UTF8 validation behavior specified by the global
+ // utf8_validation feature.
+ DEFAULT = 1;
+ // Verifies UTF8 validity overriding the global utf8_validation
+ // feature. This represents the legacy java_string_check_utf8 option.
+ VERIFY = 2;
+ }
+ optional Utf8Validation utf8_validation = 2 [
+ retention = RETENTION_RUNTIME,
+ targets = TARGET_TYPE_FIELD,
+ targets = TARGET_TYPE_FILE,
+ feature_support = {
+ edition_introduced: EDITION_2023,
+ edition_deprecated: EDITION_2024,
+ deprecation_warning: "The Java-specific utf8 validation feature is "
+ "deprecated and is scheduled to be removed in "
+ "edition 2025. Utf8 validation behavior should "
+ "use the global cross-language utf8_validation "
+ "feature.",
+ },
+ edition_defaults = { edition: EDITION_LEGACY, value: "DEFAULT" }
+ ];
+
+ // Whether to use the old default outer class name scheme, or the new feature
+ // which adds a "Proto" suffix to the outer class name.
+ //
+ // Users will not be able to set this option, because we removed it in the
+ // same edition that it was introduced. But we use it to determine which
+ // naming scheme to use for outer class name defaults.
+ optional bool use_old_outer_classname_default = 4 [
+ retention = RETENTION_RUNTIME,
+ targets = TARGET_TYPE_FILE,
+ feature_support = {
+ edition_introduced: EDITION_2024,
+ edition_removed: EDITION_2024,
+ },
+ edition_defaults = { edition: EDITION_LEGACY, value: "true" },
+ edition_defaults = { edition: EDITION_2024, value: "false" }
+ ];
+}
diff --git a/Protobuf/ProtobufCompiler/include/google/protobuf/source_context.proto b/Protobuf/ProtobufCompiler/include/google/protobuf/source_context.proto
new file mode 100644
index 0000000..135f50f
--- /dev/null
+++ b/Protobuf/ProtobufCompiler/include/google/protobuf/source_context.proto
@@ -0,0 +1,48 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+syntax = "proto3";
+
+package google.protobuf;
+
+option java_package = "com.google.protobuf";
+option java_outer_classname = "SourceContextProto";
+option java_multiple_files = true;
+option objc_class_prefix = "GPB";
+option csharp_namespace = "Google.Protobuf.WellKnownTypes";
+option go_package = "google.golang.org/protobuf/types/known/sourcecontextpb";
+
+// `SourceContext` represents information about the source of a
+// protobuf element, like the file in which it is defined.
+message SourceContext {
+ // The path-qualified name of the .proto file that contained the associated
+ // protobuf element. For example: `"google/protobuf/source_context.proto"`.
+ string file_name = 1;
+}
diff --git a/Protobuf/ProtobufCompiler/include/google/protobuf/struct.proto b/Protobuf/ProtobufCompiler/include/google/protobuf/struct.proto
new file mode 100644
index 0000000..1bf0c1a
--- /dev/null
+++ b/Protobuf/ProtobufCompiler/include/google/protobuf/struct.proto
@@ -0,0 +1,95 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+syntax = "proto3";
+
+package google.protobuf;
+
+option cc_enable_arenas = true;
+option go_package = "google.golang.org/protobuf/types/known/structpb";
+option java_package = "com.google.protobuf";
+option java_outer_classname = "StructProto";
+option java_multiple_files = true;
+option objc_class_prefix = "GPB";
+option csharp_namespace = "Google.Protobuf.WellKnownTypes";
+
+// `Struct` represents a structured data value, consisting of fields
+// which map to dynamically typed values. In some languages, `Struct`
+// might be supported by a native representation. For example, in
+// scripting languages like JS a struct is represented as an
+// object. The details of that representation are described together
+// with the proto support for the language.
+//
+// The JSON representation for `Struct` is JSON object.
+message Struct {
+ // Unordered map of dynamically typed values.
+ map fields = 1;
+}
+
+// `Value` represents a dynamically typed value which can be either
+// null, a number, a string, a boolean, a recursive struct value, or a
+// list of values. A producer of value is expected to set one of these
+// variants. Absence of any variant indicates an error.
+//
+// The JSON representation for `Value` is JSON value.
+message Value {
+ // The kind of value.
+ oneof kind {
+ // Represents a null value.
+ NullValue null_value = 1;
+ // Represents a double value.
+ double number_value = 2;
+ // Represents a string value.
+ string string_value = 3;
+ // Represents a boolean value.
+ bool bool_value = 4;
+ // Represents a structured value.
+ Struct struct_value = 5;
+ // Represents a repeated `Value`.
+ ListValue list_value = 6;
+ }
+}
+
+// `NullValue` is a singleton enumeration to represent the null value for the
+// `Value` type union.
+//
+// The JSON representation for `NullValue` is JSON `null`.
+enum NullValue {
+ // Null value.
+ NULL_VALUE = 0;
+}
+
+// `ListValue` is a wrapper around a repeated field of values.
+//
+// The JSON representation for `ListValue` is JSON array.
+message ListValue {
+ // Repeated field of dynamically typed values.
+ repeated Value values = 1;
+}
diff --git a/Protobuf/ProtobufCompiler/include/google/protobuf/timestamp.proto b/Protobuf/ProtobufCompiler/include/google/protobuf/timestamp.proto
new file mode 100644
index 0000000..fd0bc07
--- /dev/null
+++ b/Protobuf/ProtobufCompiler/include/google/protobuf/timestamp.proto
@@ -0,0 +1,144 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+syntax = "proto3";
+
+package google.protobuf;
+
+option cc_enable_arenas = true;
+option go_package = "google.golang.org/protobuf/types/known/timestamppb";
+option java_package = "com.google.protobuf";
+option java_outer_classname = "TimestampProto";
+option java_multiple_files = true;
+option objc_class_prefix = "GPB";
+option csharp_namespace = "Google.Protobuf.WellKnownTypes";
+
+// A Timestamp represents a point in time independent of any time zone or local
+// calendar, encoded as a count of seconds and fractions of seconds at
+// nanosecond resolution. The count is relative to an epoch at UTC midnight on
+// January 1, 1970, in the proleptic Gregorian calendar which extends the
+// Gregorian calendar backwards to year one.
+//
+// All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap
+// second table is needed for interpretation, using a [24-hour linear
+// smear](https://developers.google.com/time/smear).
+//
+// The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
+// restricting to that range, we ensure that we can convert to and from [RFC
+// 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
+//
+// # Examples
+//
+// Example 1: Compute Timestamp from POSIX `time()`.
+//
+// Timestamp timestamp;
+// timestamp.set_seconds(time(NULL));
+// timestamp.set_nanos(0);
+//
+// Example 2: Compute Timestamp from POSIX `gettimeofday()`.
+//
+// struct timeval tv;
+// gettimeofday(&tv, NULL);
+//
+// Timestamp timestamp;
+// timestamp.set_seconds(tv.tv_sec);
+// timestamp.set_nanos(tv.tv_usec * 1000);
+//
+// Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`.
+//
+// FILETIME ft;
+// GetSystemTimeAsFileTime(&ft);
+// UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime;
+//
+// // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z
+// // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z.
+// Timestamp timestamp;
+// timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL));
+// timestamp.set_nanos((INT32) ((ticks % 10000000) * 100));
+//
+// Example 4: Compute Timestamp from Java `System.currentTimeMillis()`.
+//
+// long millis = System.currentTimeMillis();
+//
+// Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000)
+// .setNanos((int) ((millis % 1000) * 1000000)).build();
+//
+// Example 5: Compute Timestamp from Java `Instant.now()`.
+//
+// Instant now = Instant.now();
+//
+// Timestamp timestamp =
+// Timestamp.newBuilder().setSeconds(now.getEpochSecond())
+// .setNanos(now.getNano()).build();
+//
+// Example 6: Compute Timestamp from current time in Python.
+//
+// timestamp = Timestamp()
+// timestamp.GetCurrentTime()
+//
+// # JSON Mapping
+//
+// In JSON format, the Timestamp type is encoded as a string in the
+// [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the
+// format is "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z"
+// where {year} is always expressed using four digits while {month}, {day},
+// {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional
+// seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution),
+// are optional. The "Z" suffix indicates the timezone ("UTC"); the timezone
+// is required. A proto3 JSON serializer should always use UTC (as indicated by
+// "Z") when printing the Timestamp type and a proto3 JSON parser should be
+// able to accept both UTC and other timezones (as indicated by an offset).
+//
+// For example, "2017-01-15T01:30:15.01Z" encodes 15.01 seconds past
+// 01:30 UTC on January 15, 2017.
+//
+// In JavaScript, one can convert a Date object to this format using the
+// standard
+// [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString)
+// method. In Python, a standard `datetime.datetime` object can be converted
+// to this format using
+// [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) with
+// the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one can use
+// the Joda Time's [`ISODateTimeFormat.dateTime()`](
+// http://joda-time.sourceforge.net/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime()
+// ) to obtain a formatter capable of generating timestamps in this format.
+//
+message Timestamp {
+ // Represents seconds of UTC time since Unix epoch
+ // 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
+ // 9999-12-31T23:59:59Z inclusive.
+ int64 seconds = 1;
+
+ // Non-negative fractions of a second at nanosecond resolution. Negative
+ // second values with fractions must still have non-negative nanos values
+ // that count forward in time. Must be from 0 to 999,999,999
+ // inclusive.
+ int32 nanos = 2;
+}
diff --git a/Protobuf/ProtobufCompiler/include/google/protobuf/type.proto b/Protobuf/ProtobufCompiler/include/google/protobuf/type.proto
new file mode 100644
index 0000000..48cb11e
--- /dev/null
+++ b/Protobuf/ProtobufCompiler/include/google/protobuf/type.proto
@@ -0,0 +1,193 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+syntax = "proto3";
+
+package google.protobuf;
+
+import "google/protobuf/any.proto";
+import "google/protobuf/source_context.proto";
+
+option cc_enable_arenas = true;
+option java_package = "com.google.protobuf";
+option java_outer_classname = "TypeProto";
+option java_multiple_files = true;
+option objc_class_prefix = "GPB";
+option csharp_namespace = "Google.Protobuf.WellKnownTypes";
+option go_package = "google.golang.org/protobuf/types/known/typepb";
+
+// A protocol buffer message type.
+message Type {
+ // The fully qualified message name.
+ string name = 1;
+ // The list of fields.
+ repeated Field fields = 2;
+ // The list of types appearing in `oneof` definitions in this type.
+ repeated string oneofs = 3;
+ // The protocol buffer options.
+ repeated Option options = 4;
+ // The source context.
+ SourceContext source_context = 5;
+ // The source syntax.
+ Syntax syntax = 6;
+ // The source edition string, only valid when syntax is SYNTAX_EDITIONS.
+ string edition = 7;
+}
+
+// A single field of a message type.
+message Field {
+ // Basic field types.
+ enum Kind {
+ // Field type unknown.
+ TYPE_UNKNOWN = 0;
+ // Field type double.
+ TYPE_DOUBLE = 1;
+ // Field type float.
+ TYPE_FLOAT = 2;
+ // Field type int64.
+ TYPE_INT64 = 3;
+ // Field type uint64.
+ TYPE_UINT64 = 4;
+ // Field type int32.
+ TYPE_INT32 = 5;
+ // Field type fixed64.
+ TYPE_FIXED64 = 6;
+ // Field type fixed32.
+ TYPE_FIXED32 = 7;
+ // Field type bool.
+ TYPE_BOOL = 8;
+ // Field type string.
+ TYPE_STRING = 9;
+ // Field type group. Proto2 syntax only, and deprecated.
+ TYPE_GROUP = 10;
+ // Field type message.
+ TYPE_MESSAGE = 11;
+ // Field type bytes.
+ TYPE_BYTES = 12;
+ // Field type uint32.
+ TYPE_UINT32 = 13;
+ // Field type enum.
+ TYPE_ENUM = 14;
+ // Field type sfixed32.
+ TYPE_SFIXED32 = 15;
+ // Field type sfixed64.
+ TYPE_SFIXED64 = 16;
+ // Field type sint32.
+ TYPE_SINT32 = 17;
+ // Field type sint64.
+ TYPE_SINT64 = 18;
+ }
+
+ // Whether a field is optional, required, or repeated.
+ enum Cardinality {
+ // For fields with unknown cardinality.
+ CARDINALITY_UNKNOWN = 0;
+ // For optional fields.
+ CARDINALITY_OPTIONAL = 1;
+ // For required fields. Proto2 syntax only.
+ CARDINALITY_REQUIRED = 2;
+ // For repeated fields.
+ CARDINALITY_REPEATED = 3;
+ }
+
+ // The field type.
+ Kind kind = 1;
+ // The field cardinality.
+ Cardinality cardinality = 2;
+ // The field number.
+ int32 number = 3;
+ // The field name.
+ string name = 4;
+ // The field type URL, without the scheme, for message or enumeration
+ // types. Example: `"type.googleapis.com/google.protobuf.Timestamp"`.
+ string type_url = 6;
+ // The index of the field type in `Type.oneofs`, for message or enumeration
+ // types. The first type has index 1; zero means the type is not in the list.
+ int32 oneof_index = 7;
+ // Whether to use alternative packed wire representation.
+ bool packed = 8;
+ // The protocol buffer options.
+ repeated Option options = 9;
+ // The field JSON name.
+ string json_name = 10;
+ // The string value of the default value of this field. Proto2 syntax only.
+ string default_value = 11;
+}
+
+// Enum type definition.
+message Enum {
+ // Enum type name.
+ string name = 1;
+ // Enum value definitions.
+ repeated EnumValue enumvalue = 2;
+ // Protocol buffer options.
+ repeated Option options = 3;
+ // The source context.
+ SourceContext source_context = 4;
+ // The source syntax.
+ Syntax syntax = 5;
+ // The source edition string, only valid when syntax is SYNTAX_EDITIONS.
+ string edition = 6;
+}
+
+// Enum value definition.
+message EnumValue {
+ // Enum value name.
+ string name = 1;
+ // Enum value number.
+ int32 number = 2;
+ // Protocol buffer options.
+ repeated Option options = 3;
+}
+
+// A protocol buffer option, which can be attached to a message, field,
+// enumeration, etc.
+message Option {
+ // The option's name. For protobuf built-in options (options defined in
+ // descriptor.proto), this is the short name. For example, `"map_entry"`.
+ // For custom options, it should be the fully-qualified name. For example,
+ // `"google.api.http"`.
+ string name = 1;
+ // The option's value packed in an Any message. If the value is a primitive,
+ // the corresponding wrapper type defined in google/protobuf/wrappers.proto
+ // should be used. If the value is an enum, it should be stored as an int32
+ // value using the google.protobuf.Int32Value type.
+ Any value = 2;
+}
+
+// The syntax in which a protocol buffer element is defined.
+enum Syntax {
+ // Syntax `proto2`.
+ SYNTAX_PROTO2 = 0;
+ // Syntax `proto3`.
+ SYNTAX_PROTO3 = 1;
+ // Syntax `editions`.
+ SYNTAX_EDITIONS = 2;
+}
diff --git a/Protobuf/ProtobufCompiler/include/google/protobuf/wrappers.proto b/Protobuf/ProtobufCompiler/include/google/protobuf/wrappers.proto
new file mode 100644
index 0000000..e583e7c
--- /dev/null
+++ b/Protobuf/ProtobufCompiler/include/google/protobuf/wrappers.proto
@@ -0,0 +1,157 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Wrappers for primitive (non-message) types. These types were needed
+// for legacy reasons and are not recommended for use in new APIs.
+//
+// Historically these wrappers were useful to have presence on proto3 primitive
+// fields, but proto3 syntax has been updated to support the `optional` keyword.
+// Using that keyword is now the strongly preferred way to add presence to
+// proto3 primitive fields.
+//
+// A secondary usecase was to embed primitives in the `google.protobuf.Any`
+// type: it is now recommended that you embed your value in your own wrapper
+// message which can be specifically documented.
+//
+// These wrappers have no meaningful use within repeated fields as they lack
+// the ability to detect presence on individual elements.
+// These wrappers have no meaningful use within a map or a oneof since
+// individual entries of a map or fields of a oneof can already detect presence.
+
+syntax = "proto3";
+
+package google.protobuf;
+
+option cc_enable_arenas = true;
+option go_package = "google.golang.org/protobuf/types/known/wrapperspb";
+option java_package = "com.google.protobuf";
+option java_outer_classname = "WrappersProto";
+option java_multiple_files = true;
+option objc_class_prefix = "GPB";
+option csharp_namespace = "Google.Protobuf.WellKnownTypes";
+
+// Wrapper message for `double`.
+//
+// The JSON representation for `DoubleValue` is JSON number.
+//
+// Not recommended for use in new APIs, but still useful for legacy APIs and
+// has no plan to be removed.
+message DoubleValue {
+ // The double value.
+ double value = 1;
+}
+
+// Wrapper message for `float`.
+//
+// The JSON representation for `FloatValue` is JSON number.
+//
+// Not recommended for use in new APIs, but still useful for legacy APIs and
+// has no plan to be removed.
+message FloatValue {
+ // The float value.
+ float value = 1;
+}
+
+// Wrapper message for `int64`.
+//
+// The JSON representation for `Int64Value` is JSON string.
+//
+// Not recommended for use in new APIs, but still useful for legacy APIs and
+// has no plan to be removed.
+message Int64Value {
+ // The int64 value.
+ int64 value = 1;
+}
+
+// Wrapper message for `uint64`.
+//
+// The JSON representation for `UInt64Value` is JSON string.
+//
+// Not recommended for use in new APIs, but still useful for legacy APIs and
+// has no plan to be removed.
+message UInt64Value {
+ // The uint64 value.
+ uint64 value = 1;
+}
+
+// Wrapper message for `int32`.
+//
+// The JSON representation for `Int32Value` is JSON number.
+//
+// Not recommended for use in new APIs, but still useful for legacy APIs and
+// has no plan to be removed.
+message Int32Value {
+ // The int32 value.
+ int32 value = 1;
+}
+
+// Wrapper message for `uint32`.
+//
+// The JSON representation for `UInt32Value` is JSON number.
+//
+// Not recommended for use in new APIs, but still useful for legacy APIs and
+// has no plan to be removed.
+message UInt32Value {
+ // The uint32 value.
+ uint32 value = 1;
+}
+
+// Wrapper message for `bool`.
+//
+// The JSON representation for `BoolValue` is JSON `true` and `false`.
+//
+// Not recommended for use in new APIs, but still useful for legacy APIs and
+// has no plan to be removed.
+message BoolValue {
+ // The bool value.
+ bool value = 1;
+}
+
+// Wrapper message for `string`.
+//
+// The JSON representation for `StringValue` is JSON string.
+//
+// Not recommended for use in new APIs, but still useful for legacy APIs and
+// has no plan to be removed.
+message StringValue {
+ // The string value.
+ string value = 1;
+}
+
+// Wrapper message for `bytes`.
+//
+// The JSON representation for `BytesValue` is JSON string.
+//
+// Not recommended for use in new APIs, but still useful for legacy APIs and
+// has no plan to be removed.
+message BytesValue {
+ // The bytes value.
+ bytes value = 1;
+}
diff --git a/Protobuf/ProtobufCompiler/protoc-30.2-win64.zip b/Protobuf/ProtobufCompiler/protoc-30.2-win64.zip
new file mode 100644
index 0000000..a65187f
Binary files /dev/null and b/Protobuf/ProtobufCompiler/protoc-30.2-win64.zip differ
diff --git a/Protobuf/ProtobufCompiler/readme.txt b/Protobuf/ProtobufCompiler/readme.txt
new file mode 100644
index 0000000..f7f091f
--- /dev/null
+++ b/Protobuf/ProtobufCompiler/readme.txt
@@ -0,0 +1,12 @@
+Protocol Buffers - Google's data interchange format
+Copyright 2008 Google Inc.
+https://developers.google.com/protocol-buffers/
+This package contains a precompiled binary version of the protocol buffer
+compiler (protoc). This binary is intended for users who want to use Protocol
+Buffers in languages other than C++ but do not want to compile protoc
+themselves. To install, simply place this binary somewhere in your PATH.
+If you intend to use the included well known types then don't forget to
+copy the contents of the 'include' directory somewhere as well, for example
+into '/usr/local/include/'.
+Please refer to our official github site for more installation instructions:
+ https://github.com/protocolbuffers/protobuf
diff --git a/Protobuf/README.md b/Protobuf/README.md
new file mode 100644
index 0000000..b1ccdc8
--- /dev/null
+++ b/Protobuf/README.md
@@ -0,0 +1,4 @@
+# Protobuf
+协议相关的都放这里,目前没有协议功能
+
+
diff --git a/Protobuf/gen_client.bat b/Protobuf/gen_client.bat
new file mode 100644
index 0000000..8d774fd
--- /dev/null
+++ b/Protobuf/gen_client.bat
@@ -0,0 +1,27 @@
+@echo off
+setlocal enabledelayedexpansion
+
+:: 输入目标文件夹路径
+set "baseDir=Protobuf"
+set "path=ProtobufCompiler/bin"
+
+:: 转换为绝对路径并确保以反斜杠结尾
+for %%I in ("%baseDir%") do set "baseDirAbs=%%~fI\"
+
+:: 递归遍历所有文件并输出包含父目录名的相对路径
+for /r "%baseDirAbs%" %%F in (*) do (
+ set "absPath=%%F"
+ set "relPath=!absPath:%baseDirAbs%=!"
+ echo %baseDir%\!relPath!
+ call protoc.exe --csharp_out=generated %baseDir%\!relPath!
+)
+
+endlocal
+
+:: 设置源目录和目标目录
+set "source_dir=generated"
+set "target_dir=..\UnityGame\Assets\Script\Export\protobuf"
+
+:: 拷贝所有文件
+xcopy "%source_dir%\*" "%target_dir%" /E /C /H /Y
+pause
diff --git a/Protobuf/gen_server.bat b/Protobuf/gen_server.bat
new file mode 100644
index 0000000..424af92
--- /dev/null
+++ b/Protobuf/gen_server.bat
@@ -0,0 +1,37 @@
+@echo off
+setlocal enabledelayedexpansion
+
+:: 输入目标文件夹路径
+set "baseDir=Protobuf"
+set "path=ProtobufCompiler/bin"
+
+:: 清理目标目录
+if exist generated (
+ echo 正在清理目标目录: %TARGET_DIR%
+ rmdir /s /q generated
+ mkdir generated
+) else (
+ echo 创建目标目录: generated
+ mkdir generated
+)
+
+:: 转换为绝对路径并确保以反斜杠结尾
+for %%I in ("%baseDir%") do set "baseDirAbs=%%~fI\"
+
+:: 递归遍历所有文件并输出包含父目录名的相对路径
+for /r "%baseDirAbs%" %%F in (*) do (
+ set "absPath=%%F"
+ set "relPath=!absPath:%baseDirAbs%=!"
+ echo %baseDir%\!relPath!
+ call protoc.exe --csharp_out=generated %baseDir%\!relPath!
+)
+
+endlocal
+
+:: 设置源目录和目标目录
+set "source_dir=generated"
+set "target_dir=..\GameServer\ProtoBuf"
+
+:: 拷贝所有文件
+xcopy "%source_dir%\*" "%target_dir%" /E /C /H /Y
+pause
diff --git a/Protobuf/generate_protobuf.bat b/Protobuf/generate_protobuf.bat
new file mode 100644
index 0000000..49e05df
--- /dev/null
+++ b/Protobuf/generate_protobuf.bat
@@ -0,0 +1,20 @@
+@echo off
+setlocal enabledelayedexpansion
+
+:: 输入目标文件夹路径
+set "baseDir=Protobuf"
+set "path=ProtobufCompiler/bin"
+
+:: 转换为绝对路径并确保以反斜杠结尾
+for %%I in ("%baseDir%") do set "baseDirAbs=%%~fI\"
+
+:: 递归遍历所有文件并输出包含父目录名的相对路径
+for /r "%baseDirAbs%" %%F in (*) do (
+ set "absPath=%%F"
+ set "relPath=!absPath:%baseDirAbs%=!"
+ echo %baseDir%\!relPath!
+ call protoc.exe --csharp_out=generated %baseDir%\!relPath!
+)
+
+endlocal
+pause
\ No newline at end of file
diff --git a/UnityGame/Assets/AddressableAssetsData.meta b/UnityGame/Assets/AddressableAssetsData.meta
new file mode 100644
index 0000000..89d9efb
--- /dev/null
+++ b/UnityGame/Assets/AddressableAssetsData.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 6dfab353d033694499ca2d4dc5fe3759
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/UnityGame/Assets/AddressableAssetsData/AddressableAssetSettings.asset b/UnityGame/Assets/AddressableAssetsData/AddressableAssetSettings.asset
new file mode 100644
index 0000000..1248ccb
--- /dev/null
+++ b/UnityGame/Assets/AddressableAssetsData/AddressableAssetSettings.asset
@@ -0,0 +1,110 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 0}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 468a46d0ae32c3544b7d98094e6448a9, type: 3}
+ m_Name: AddressableAssetSettings
+ m_EditorClassIdentifier:
+ m_DefaultGroup: e54335de04e226844af6d4f43cee569c
+ m_currentHash:
+ serializedVersion: 2
+ Hash: cd35e3c1d2d48426aafe779a9dace230
+ m_OptimizeCatalogSize: 0
+ m_BuildRemoteCatalog: 0
+ m_BundleLocalCatalog: 0
+ m_CatalogRequestsTimeout: 0
+ m_DisableCatalogUpdateOnStart: 0
+ m_IgnoreUnsupportedFilesInBuild: 0
+ m_UniqueBundleIds: 0
+ m_NonRecursiveBuilding: 1
+ m_CCDEnabled: 0
+ m_maxConcurrentWebRequests: 3
+ m_ContiguousBundles: 1
+ m_StripUnityVersionFromBundleBuild: 0
+ m_DisableVisibleSubAssetRepresentations: 0
+ m_ShaderBundleNaming: 0
+ m_ShaderBundleCustomNaming:
+ m_MonoScriptBundleNaming: 0
+ m_CheckForContentUpdateRestrictionsOption: 0
+ m_MonoScriptBundleCustomNaming:
+ m_RemoteCatalogBuildPath:
+ m_Id: 36853bc6a666d5b4ea814a445c98ed2c
+ m_RemoteCatalogLoadPath:
+ m_Id: dced63f509c396140a36d22ade35f14a
+ m_ContentStateBuildPathProfileVariableName:
+ m_CustomContentStateBuildPath:
+ m_ContentStateBuildPath:
+ m_BuildAddressablesWithPlayerBuild: 0
+ m_overridePlayerVersion: '[UnityEditor.PlayerSettings.bundleVersion]'
+ m_GroupAssets:
+ - {fileID: 11400000, guid: cfd14092cb8b5214783a85eca0d9cca8, type: 2}
+ - {fileID: 11400000, guid: eb2aeb5a2bce51f4facdd581d7366b4e, type: 2}
+ - {fileID: 11400000, guid: 007e774c893388348a61b78777b367d1, type: 2}
+ m_BuildSettings:
+ m_CompileScriptsInVirtualMode: 0
+ m_CleanupStreamingAssetsAfterBuilds: 1
+ m_LogResourceManagerExceptions: 1
+ m_BundleBuildPath: Temp/com.unity.addressables/AssetBundles
+ m_ProfileSettings:
+ m_Profiles:
+ - m_InheritedParent:
+ m_Id: 3321b2a0b1145c84c8d75672c701c6d6
+ m_ProfileName: Default
+ m_Values:
+ - m_Id: 36853bc6a666d5b4ea814a445c98ed2c
+ m_Value: ServerData/[BuildTarget]
+ - m_Id: 72610b7298d61d8479e7a5a63624e5d4
+ m_Value: '[UnityEngine.AddressableAssets.Addressables.BuildPath]/[BuildTarget]'
+ - m_Id: 7660bcb6adca4d1499e46dc07ab4a7e9
+ m_Value: '[UnityEditor.EditorUserBuildSettings.activeBuildTarget]'
+ - m_Id: a8f73f9927a68eb45af22248117f3e4a
+ m_Value: '{UnityEngine.AddressableAssets.Addressables.RuntimePath}/[BuildTarget]'
+ - m_Id: dced63f509c396140a36d22ade35f14a
+ m_Value: http://[PrivateIpAddress]:[HostingServicePort]
+ m_ProfileEntryNames:
+ - m_Id: 36853bc6a666d5b4ea814a445c98ed2c
+ m_Name: Remote.BuildPath
+ m_InlineUsage: 0
+ - m_Id: 72610b7298d61d8479e7a5a63624e5d4
+ m_Name: Local.BuildPath
+ m_InlineUsage: 0
+ - m_Id: 7660bcb6adca4d1499e46dc07ab4a7e9
+ m_Name: BuildTarget
+ m_InlineUsage: 0
+ - m_Id: a8f73f9927a68eb45af22248117f3e4a
+ m_Name: Local.LoadPath
+ m_InlineUsage: 0
+ - m_Id: dced63f509c396140a36d22ade35f14a
+ m_Name: Remote.LoadPath
+ m_InlineUsage: 0
+ m_ProfileVersion: 1
+ m_LabelTable:
+ m_LabelNames:
+ - default
+ m_SchemaTemplates: []
+ m_GroupTemplateObjects:
+ - {fileID: 11400000, guid: 68f6c0db0b4752b4b9a3854691e8d5b7, type: 2}
+ m_InitializationObjects: []
+ m_CertificateHandlerType:
+ m_AssemblyName:
+ m_ClassName:
+ m_ActivePlayerDataBuilderIndex: 3
+ m_DataBuilders:
+ - {fileID: 11400000, guid: dbeab25dce279bb4fb1d3696f418ad10, type: 2}
+ - {fileID: 11400000, guid: e4d993962efadd045bea1ea28cfb133b, type: 2}
+ - {fileID: 11400000, guid: 99c65de7df91ae747a4131e026a8d808, type: 2}
+ - {fileID: 11400000, guid: c6fa6b11ce779d74eb5ef054b1327a50, type: 2}
+ m_ActiveProfileId: 3321b2a0b1145c84c8d75672c701c6d6
+ m_HostingServicesManager:
+ m_HostingServiceInfos: []
+ m_Settings: {fileID: 11400000}
+ m_NextInstanceId: 0
+ m_RegisteredServiceTypeRefs: []
+ m_PingTimeoutInMilliseconds: 5000
diff --git a/UnityGame/Assets/AddressableAssetsData/AddressableAssetSettings.asset.meta b/UnityGame/Assets/AddressableAssetsData/AddressableAssetSettings.asset.meta
new file mode 100644
index 0000000..67d84b5
--- /dev/null
+++ b/UnityGame/Assets/AddressableAssetsData/AddressableAssetSettings.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: bee6bc9b5cc8353408a831cc694fcc59
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/UnityGame/Assets/AddressableAssetsData/AssetGroupTemplates.meta b/UnityGame/Assets/AddressableAssetsData/AssetGroupTemplates.meta
new file mode 100644
index 0000000..0090682
--- /dev/null
+++ b/UnityGame/Assets/AddressableAssetsData/AssetGroupTemplates.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: bfe67a12459839a4da1ac9b61730e1df
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/UnityGame/Assets/AddressableAssetsData/AssetGroupTemplates/Packed Assets.asset b/UnityGame/Assets/AddressableAssetsData/AssetGroupTemplates/Packed Assets.asset
new file mode 100644
index 0000000..52f30ff
--- /dev/null
+++ b/UnityGame/Assets/AddressableAssetsData/AssetGroupTemplates/Packed Assets.asset
@@ -0,0 +1,76 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 0}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 1a3c5d64ac83548c09dd1678b9f6f1cd, type: 3}
+ m_Name: Packed Assets
+ m_EditorClassIdentifier:
+ m_SchemaObjects:
+ - {fileID: 3592763626816202536}
+ - {fileID: 4035926243289076600}
+ m_Description: Pack assets into asset bundles.
+ m_Settings: {fileID: 11400000, guid: bee6bc9b5cc8353408a831cc694fcc59, type: 2}
+--- !u!114 &3592763626816202536
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 0}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: e5d17a21594effb4e9591490b009e7aa, type: 3}
+ m_Name: BundledAssetGroupSchema
+ m_EditorClassIdentifier:
+ m_Group: {fileID: 0}
+ m_InternalBundleIdMode: 1
+ m_Compression: 1
+ m_IncludeAddressInCatalog: 1
+ m_IncludeGUIDInCatalog: 1
+ m_IncludeLabelsInCatalog: 1
+ m_InternalIdNamingMode: 0
+ m_CacheClearBehavior: 0
+ m_IncludeInBuild: 1
+ m_BundledAssetProviderType:
+ m_AssemblyName:
+ m_ClassName:
+ m_ForceUniqueProvider: 0
+ m_UseAssetBundleCache: 1
+ m_UseAssetBundleCrc: 1
+ m_UseAssetBundleCrcForCachedBundles: 1
+ m_UseUWRForLocalBundles: 0
+ m_Timeout: 0
+ m_ChunkedTransfer: 0
+ m_RedirectLimit: -1
+ m_RetryCount: 0
+ m_BuildPath:
+ m_Id:
+ m_LoadPath:
+ m_Id:
+ m_BundleMode: 0
+ m_AssetBundleProviderType:
+ m_AssemblyName:
+ m_ClassName:
+ m_BundleNaming: 0
+ m_AssetLoadMode: 0
+--- !u!114 &4035926243289076600
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 0}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 5834b5087d578d24c926ce20cd31e6d6, type: 3}
+ m_Name: ContentUpdateGroupSchema
+ m_EditorClassIdentifier:
+ m_Group: {fileID: 0}
+ m_StaticContent: 0
diff --git a/UnityGame/Assets/AddressableAssetsData/AssetGroupTemplates/Packed Assets.asset.meta b/UnityGame/Assets/AddressableAssetsData/AssetGroupTemplates/Packed Assets.asset.meta
new file mode 100644
index 0000000..4b262c1
--- /dev/null
+++ b/UnityGame/Assets/AddressableAssetsData/AssetGroupTemplates/Packed Assets.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 68f6c0db0b4752b4b9a3854691e8d5b7
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/UnityGame/Assets/AddressableAssetsData/AssetGroups.meta b/UnityGame/Assets/AddressableAssetsData/AssetGroups.meta
new file mode 100644
index 0000000..f02d60d
--- /dev/null
+++ b/UnityGame/Assets/AddressableAssetsData/AssetGroups.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: e0e66ab72a603154fb31baccc7448b6f
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/UnityGame/Assets/AddressableAssetsData/AssetGroups/Built In Data.asset b/UnityGame/Assets/AddressableAssetsData/AssetGroups/Built In Data.asset
new file mode 100644
index 0000000..28f3b66
--- /dev/null
+++ b/UnityGame/Assets/AddressableAssetsData/AssetGroups/Built In Data.asset
@@ -0,0 +1,34 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 0}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: bbb281ee3bf0b054c82ac2347e9e782c, type: 3}
+ m_Name: Built In Data
+ m_EditorClassIdentifier:
+ m_GroupName: Built In Data
+ m_Data:
+ m_SerializedData: []
+ m_GUID: 041e7a6acc4cc1346a3a06de1c2c88ec
+ m_SerializeEntries:
+ - m_GUID: EditorSceneList
+ m_Address: EditorSceneList
+ m_ReadOnly: 1
+ m_SerializedLabels: []
+ FlaggedDuringContentUpdateRestriction: 0
+ - m_GUID: Resources
+ m_Address: Resources
+ m_ReadOnly: 1
+ m_SerializedLabels: []
+ FlaggedDuringContentUpdateRestriction: 0
+ m_ReadOnly: 1
+ m_Settings: {fileID: 11400000, guid: bee6bc9b5cc8353408a831cc694fcc59, type: 2}
+ m_SchemaSet:
+ m_Schemas:
+ - {fileID: 11400000, guid: 91cc52ef7fc4bb147a70350b182acf9f, type: 2}
diff --git a/UnityGame/Assets/AddressableAssetsData/AssetGroups/Built In Data.asset.meta b/UnityGame/Assets/AddressableAssetsData/AssetGroups/Built In Data.asset.meta
new file mode 100644
index 0000000..4764e74
--- /dev/null
+++ b/UnityGame/Assets/AddressableAssetsData/AssetGroups/Built In Data.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: cfd14092cb8b5214783a85eca0d9cca8
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/UnityGame/Assets/AddressableAssetsData/AssetGroups/Common.asset b/UnityGame/Assets/AddressableAssetsData/AssetGroups/Common.asset
new file mode 100644
index 0000000..ce5dd48
--- /dev/null
+++ b/UnityGame/Assets/AddressableAssetsData/AssetGroups/Common.asset
@@ -0,0 +1,25 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 0}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: bbb281ee3bf0b054c82ac2347e9e782c, type: 3}
+ m_Name: Common
+ m_EditorClassIdentifier:
+ m_GroupName: Common
+ m_Data:
+ m_SerializedData: []
+ m_GUID: e54335de04e226844af6d4f43cee569c
+ m_SerializeEntries: []
+ m_ReadOnly: 0
+ m_Settings: {fileID: 11400000, guid: bee6bc9b5cc8353408a831cc694fcc59, type: 2}
+ m_SchemaSet:
+ m_Schemas:
+ - {fileID: 11400000, guid: a2fba655644d857428bace633d702f5b, type: 2}
+ - {fileID: 11400000, guid: 851fe9813e5e16b4f9f6c6460d971e95, type: 2}
diff --git a/UnityGame/Assets/AddressableAssetsData/AssetGroups/Common.asset.meta b/UnityGame/Assets/AddressableAssetsData/AssetGroups/Common.asset.meta
new file mode 100644
index 0000000..736d16e
--- /dev/null
+++ b/UnityGame/Assets/AddressableAssetsData/AssetGroups/Common.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 007e774c893388348a61b78777b367d1
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/UnityGame/Assets/AddressableAssetsData/AssetGroups/Schemas.meta b/UnityGame/Assets/AddressableAssetsData/AssetGroups/Schemas.meta
new file mode 100644
index 0000000..f9eba1b
--- /dev/null
+++ b/UnityGame/Assets/AddressableAssetsData/AssetGroups/Schemas.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: f12aba9a63bf16a4d980bbdc8c6ce779
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/UnityGame/Assets/AddressableAssetsData/AssetGroups/Schemas/Built In Data_PlayerDataGroupSchema.asset b/UnityGame/Assets/AddressableAssetsData/AssetGroups/Schemas/Built In Data_PlayerDataGroupSchema.asset
new file mode 100644
index 0000000..ed78dcd
--- /dev/null
+++ b/UnityGame/Assets/AddressableAssetsData/AssetGroups/Schemas/Built In Data_PlayerDataGroupSchema.asset
@@ -0,0 +1,17 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 0}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: b1487f5d688e4f94f828f879d599dbdc, type: 3}
+ m_Name: Built In Data_PlayerDataGroupSchema
+ m_EditorClassIdentifier:
+ m_Group: {fileID: 11400000, guid: cfd14092cb8b5214783a85eca0d9cca8, type: 2}
+ m_IncludeResourcesFolders: 1
+ m_IncludeBuildSettingsScenes: 1
diff --git a/UnityGame/Assets/AddressableAssetsData/AssetGroups/Schemas/Built In Data_PlayerDataGroupSchema.asset.meta b/UnityGame/Assets/AddressableAssetsData/AssetGroups/Schemas/Built In Data_PlayerDataGroupSchema.asset.meta
new file mode 100644
index 0000000..e9bb75b
--- /dev/null
+++ b/UnityGame/Assets/AddressableAssetsData/AssetGroups/Schemas/Built In Data_PlayerDataGroupSchema.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 91cc52ef7fc4bb147a70350b182acf9f
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/UnityGame/Assets/AddressableAssetsData/AssetGroups/Schemas/Common_BundledAssetGroupSchema.asset b/UnityGame/Assets/AddressableAssetsData/AssetGroups/Schemas/Common_BundledAssetGroupSchema.asset
new file mode 100644
index 0000000..aca46cb
--- /dev/null
+++ b/UnityGame/Assets/AddressableAssetsData/AssetGroups/Schemas/Common_BundledAssetGroupSchema.asset
@@ -0,0 +1,45 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 0}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: e5d17a21594effb4e9591490b009e7aa, type: 3}
+ m_Name: Common_BundledAssetGroupSchema
+ m_EditorClassIdentifier:
+ m_Group: {fileID: 11400000, guid: 007e774c893388348a61b78777b367d1, type: 2}
+ m_InternalBundleIdMode: 1
+ m_Compression: 1
+ m_IncludeAddressInCatalog: 1
+ m_IncludeGUIDInCatalog: 1
+ m_IncludeLabelsInCatalog: 1
+ m_InternalIdNamingMode: 0
+ m_CacheClearBehavior: 0
+ m_IncludeInBuild: 1
+ m_BundledAssetProviderType:
+ m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.BundledAssetProvider
+ m_ForceUniqueProvider: 0
+ m_UseAssetBundleCache: 1
+ m_UseAssetBundleCrc: 1
+ m_UseAssetBundleCrcForCachedBundles: 1
+ m_UseUWRForLocalBundles: 0
+ m_Timeout: 0
+ m_ChunkedTransfer: 0
+ m_RedirectLimit: -1
+ m_RetryCount: 0
+ m_BuildPath:
+ m_Id: 72610b7298d61d8479e7a5a63624e5d4
+ m_LoadPath:
+ m_Id: a8f73f9927a68eb45af22248117f3e4a
+ m_BundleMode: 0
+ m_AssetBundleProviderType:
+ m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.AssetBundleProvider
+ m_BundleNaming: 0
+ m_AssetLoadMode: 0
diff --git a/UnityGame/Assets/AddressableAssetsData/AssetGroups/Schemas/Common_BundledAssetGroupSchema.asset.meta b/UnityGame/Assets/AddressableAssetsData/AssetGroups/Schemas/Common_BundledAssetGroupSchema.asset.meta
new file mode 100644
index 0000000..7d5dd3b
--- /dev/null
+++ b/UnityGame/Assets/AddressableAssetsData/AssetGroups/Schemas/Common_BundledAssetGroupSchema.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: a2fba655644d857428bace633d702f5b
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/UnityGame/Assets/AddressableAssetsData/AssetGroups/Schemas/Common_ContentUpdateGroupSchema.asset b/UnityGame/Assets/AddressableAssetsData/AssetGroups/Schemas/Common_ContentUpdateGroupSchema.asset
new file mode 100644
index 0000000..0c31f39
--- /dev/null
+++ b/UnityGame/Assets/AddressableAssetsData/AssetGroups/Schemas/Common_ContentUpdateGroupSchema.asset
@@ -0,0 +1,16 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 0}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 5834b5087d578d24c926ce20cd31e6d6, type: 3}
+ m_Name: Common_ContentUpdateGroupSchema
+ m_EditorClassIdentifier:
+ m_Group: {fileID: 11400000, guid: 007e774c893388348a61b78777b367d1, type: 2}
+ m_StaticContent: 0
diff --git a/UnityGame/Assets/AddressableAssetsData/AssetGroups/Schemas/Common_ContentUpdateGroupSchema.asset.meta b/UnityGame/Assets/AddressableAssetsData/AssetGroups/Schemas/Common_ContentUpdateGroupSchema.asset.meta
new file mode 100644
index 0000000..64793a6
--- /dev/null
+++ b/UnityGame/Assets/AddressableAssetsData/AssetGroups/Schemas/Common_ContentUpdateGroupSchema.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 851fe9813e5e16b4f9f6c6460d971e95
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/UnityGame/Assets/AddressableAssetsData/AssetGroups/Schemas/UI_BundledAssetGroupSchema.asset b/UnityGame/Assets/AddressableAssetsData/AssetGroups/Schemas/UI_BundledAssetGroupSchema.asset
new file mode 100644
index 0000000..7afb643
--- /dev/null
+++ b/UnityGame/Assets/AddressableAssetsData/AssetGroups/Schemas/UI_BundledAssetGroupSchema.asset
@@ -0,0 +1,45 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 0}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: e5d17a21594effb4e9591490b009e7aa, type: 3}
+ m_Name: UI_BundledAssetGroupSchema
+ m_EditorClassIdentifier:
+ m_Group: {fileID: 11400000, guid: eb2aeb5a2bce51f4facdd581d7366b4e, type: 2}
+ m_InternalBundleIdMode: 1
+ m_Compression: 1
+ m_IncludeAddressInCatalog: 1
+ m_IncludeGUIDInCatalog: 1
+ m_IncludeLabelsInCatalog: 1
+ m_InternalIdNamingMode: 0
+ m_CacheClearBehavior: 0
+ m_IncludeInBuild: 1
+ m_BundledAssetProviderType:
+ m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.BundledAssetProvider
+ m_ForceUniqueProvider: 0
+ m_UseAssetBundleCache: 1
+ m_UseAssetBundleCrc: 1
+ m_UseAssetBundleCrcForCachedBundles: 1
+ m_UseUWRForLocalBundles: 0
+ m_Timeout: 0
+ m_ChunkedTransfer: 0
+ m_RedirectLimit: -1
+ m_RetryCount: 0
+ m_BuildPath:
+ m_Id: 72610b7298d61d8479e7a5a63624e5d4
+ m_LoadPath:
+ m_Id: a8f73f9927a68eb45af22248117f3e4a
+ m_BundleMode: 0
+ m_AssetBundleProviderType:
+ m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.AssetBundleProvider
+ m_BundleNaming: 0
+ m_AssetLoadMode: 0
diff --git a/UnityGame/Assets/AddressableAssetsData/AssetGroups/Schemas/UI_BundledAssetGroupSchema.asset.meta b/UnityGame/Assets/AddressableAssetsData/AssetGroups/Schemas/UI_BundledAssetGroupSchema.asset.meta
new file mode 100644
index 0000000..e3028a8
--- /dev/null
+++ b/UnityGame/Assets/AddressableAssetsData/AssetGroups/Schemas/UI_BundledAssetGroupSchema.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: af8f3488000374f47b04e7ea38e47b0f
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/UnityGame/Assets/AddressableAssetsData/AssetGroups/Schemas/UI_ContentUpdateGroupSchema.asset b/UnityGame/Assets/AddressableAssetsData/AssetGroups/Schemas/UI_ContentUpdateGroupSchema.asset
new file mode 100644
index 0000000..c17c282
--- /dev/null
+++ b/UnityGame/Assets/AddressableAssetsData/AssetGroups/Schemas/UI_ContentUpdateGroupSchema.asset
@@ -0,0 +1,16 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 0}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 5834b5087d578d24c926ce20cd31e6d6, type: 3}
+ m_Name: UI_ContentUpdateGroupSchema
+ m_EditorClassIdentifier:
+ m_Group: {fileID: 11400000, guid: eb2aeb5a2bce51f4facdd581d7366b4e, type: 2}
+ m_StaticContent: 0
diff --git a/UnityGame/Assets/AddressableAssetsData/AssetGroups/Schemas/UI_ContentUpdateGroupSchema.asset.meta b/UnityGame/Assets/AddressableAssetsData/AssetGroups/Schemas/UI_ContentUpdateGroupSchema.asset.meta
new file mode 100644
index 0000000..add5162
--- /dev/null
+++ b/UnityGame/Assets/AddressableAssetsData/AssetGroups/Schemas/UI_ContentUpdateGroupSchema.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: ef6b2b87f7cac3b4dba26aa9c1f9dd80
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/UnityGame/Assets/AddressableAssetsData/AssetGroups/UI.asset b/UnityGame/Assets/AddressableAssetsData/AssetGroups/UI.asset
new file mode 100644
index 0000000..1db82bb
--- /dev/null
+++ b/UnityGame/Assets/AddressableAssetsData/AssetGroups/UI.asset
@@ -0,0 +1,25 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 0}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: bbb281ee3bf0b054c82ac2347e9e782c, type: 3}
+ m_Name: UI
+ m_EditorClassIdentifier:
+ m_GroupName: UI
+ m_Data:
+ m_SerializedData: []
+ m_GUID: 225bd79756fccf14b86d3deb4a2750b7
+ m_SerializeEntries: []
+ m_ReadOnly: 0
+ m_Settings: {fileID: 11400000, guid: bee6bc9b5cc8353408a831cc694fcc59, type: 2}
+ m_SchemaSet:
+ m_Schemas:
+ - {fileID: 11400000, guid: af8f3488000374f47b04e7ea38e47b0f, type: 2}
+ - {fileID: 11400000, guid: ef6b2b87f7cac3b4dba26aa9c1f9dd80, type: 2}
diff --git a/UnityGame/Assets/AddressableAssetsData/AssetGroups/UI.asset.meta b/UnityGame/Assets/AddressableAssetsData/AssetGroups/UI.asset.meta
new file mode 100644
index 0000000..950fc4d
--- /dev/null
+++ b/UnityGame/Assets/AddressableAssetsData/AssetGroups/UI.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: eb2aeb5a2bce51f4facdd581d7366b4e
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/UnityGame/Assets/AddressableAssetsData/DataBuilders.meta b/UnityGame/Assets/AddressableAssetsData/DataBuilders.meta
new file mode 100644
index 0000000..9cba1b8
--- /dev/null
+++ b/UnityGame/Assets/AddressableAssetsData/DataBuilders.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: f6078d15faf0df249b1e3b6095cace6e
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/UnityGame/Assets/AddressableAssetsData/DataBuilders/BuildScriptFastMode.asset b/UnityGame/Assets/AddressableAssetsData/DataBuilders/BuildScriptFastMode.asset
new file mode 100644
index 0000000..50d30dc
--- /dev/null
+++ b/UnityGame/Assets/AddressableAssetsData/DataBuilders/BuildScriptFastMode.asset
@@ -0,0 +1,20 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 0}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 88d21199f5d473f4db36845f2318f180, type: 3}
+ m_Name: BuildScriptFastMode
+ m_EditorClassIdentifier:
+ instanceProviderType:
+ m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.InstanceProvider
+ sceneProviderType:
+ m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.SceneProvider
diff --git a/UnityGame/Assets/AddressableAssetsData/DataBuilders/BuildScriptFastMode.asset.meta b/UnityGame/Assets/AddressableAssetsData/DataBuilders/BuildScriptFastMode.asset.meta
new file mode 100644
index 0000000..72f660f
--- /dev/null
+++ b/UnityGame/Assets/AddressableAssetsData/DataBuilders/BuildScriptFastMode.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: dbeab25dce279bb4fb1d3696f418ad10
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/UnityGame/Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedMode.asset b/UnityGame/Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedMode.asset
new file mode 100644
index 0000000..ec875f9
--- /dev/null
+++ b/UnityGame/Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedMode.asset
@@ -0,0 +1,20 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 0}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 3e2e0ffa088c91d41a086d0b8cb16bdc, type: 3}
+ m_Name: BuildScriptPackedMode
+ m_EditorClassIdentifier:
+ instanceProviderType:
+ m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.InstanceProvider
+ sceneProviderType:
+ m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.SceneProvider
diff --git a/UnityGame/Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedMode.asset.meta b/UnityGame/Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedMode.asset.meta
new file mode 100644
index 0000000..0957333
--- /dev/null
+++ b/UnityGame/Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedMode.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: c6fa6b11ce779d74eb5ef054b1327a50
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/UnityGame/Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedPlayMode.asset b/UnityGame/Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedPlayMode.asset
new file mode 100644
index 0000000..7628845
--- /dev/null
+++ b/UnityGame/Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedPlayMode.asset
@@ -0,0 +1,20 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 0}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: ad8c280d42ee0ed41a27db23b43dd2bf, type: 3}
+ m_Name: BuildScriptPackedPlayMode
+ m_EditorClassIdentifier:
+ instanceProviderType:
+ m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.InstanceProvider
+ sceneProviderType:
+ m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.SceneProvider
diff --git a/UnityGame/Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedPlayMode.asset.meta b/UnityGame/Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedPlayMode.asset.meta
new file mode 100644
index 0000000..9a04d7f
--- /dev/null
+++ b/UnityGame/Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedPlayMode.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 99c65de7df91ae747a4131e026a8d808
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/UnityGame/Assets/AddressableAssetsData/DataBuilders/BuildScriptVirtualMode.asset b/UnityGame/Assets/AddressableAssetsData/DataBuilders/BuildScriptVirtualMode.asset
new file mode 100644
index 0000000..dfb2d58
--- /dev/null
+++ b/UnityGame/Assets/AddressableAssetsData/DataBuilders/BuildScriptVirtualMode.asset
@@ -0,0 +1,20 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 0}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: bb0e4994b34add1409fd8ccaf4a82de5, type: 3}
+ m_Name: BuildScriptVirtualMode
+ m_EditorClassIdentifier:
+ instanceProviderType:
+ m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.InstanceProvider
+ sceneProviderType:
+ m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.SceneProvider
diff --git a/UnityGame/Assets/AddressableAssetsData/DataBuilders/BuildScriptVirtualMode.asset.meta b/UnityGame/Assets/AddressableAssetsData/DataBuilders/BuildScriptVirtualMode.asset.meta
new file mode 100644
index 0000000..64fa683
--- /dev/null
+++ b/UnityGame/Assets/AddressableAssetsData/DataBuilders/BuildScriptVirtualMode.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: e4d993962efadd045bea1ea28cfb133b
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/UnityGame/Assets/AddressableAssetsData/DefaultObject.asset b/UnityGame/Assets/AddressableAssetsData/DefaultObject.asset
new file mode 100644
index 0000000..12f2a49
--- /dev/null
+++ b/UnityGame/Assets/AddressableAssetsData/DefaultObject.asset
@@ -0,0 +1,15 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 0}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 3a189bb168d8d90478a09ea08c2f3d72, type: 3}
+ m_Name: DefaultObject
+ m_EditorClassIdentifier:
+ m_AddressableAssetSettingsGuid: bee6bc9b5cc8353408a831cc694fcc59
diff --git a/UnityGame/Assets/AddressableAssetsData/DefaultObject.asset.meta b/UnityGame/Assets/AddressableAssetsData/DefaultObject.asset.meta
new file mode 100644
index 0000000..f05a00d
--- /dev/null
+++ b/UnityGame/Assets/AddressableAssetsData/DefaultObject.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 99d814bd438c51f4385a7705369b0a13
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/UnityGame/Assets/AddressableAssetsData/ProfileDataSourceSettings.asset b/UnityGame/Assets/AddressableAssetsData/ProfileDataSourceSettings.asset
new file mode 100644
index 0000000..dbceac1
--- /dev/null
+++ b/UnityGame/Assets/AddressableAssetsData/ProfileDataSourceSettings.asset
@@ -0,0 +1,22 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 0}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 7e3976da977cb49238499ea3b4c237ae, type: 3}
+ m_Name: ProfileDataSourceSettings
+ m_EditorClassIdentifier:
+ profileGroupTypes: []
+ environments: []
+ currentEnvironment:
+ id:
+ projectId:
+ projectGenesisId:
+ name:
+ isDefault: 0
diff --git a/UnityGame/Assets/AddressableAssetsData/ProfileDataSourceSettings.asset.meta b/UnityGame/Assets/AddressableAssetsData/ProfileDataSourceSettings.asset.meta
new file mode 100644
index 0000000..90ef4bf
--- /dev/null
+++ b/UnityGame/Assets/AddressableAssetsData/ProfileDataSourceSettings.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 88305f3a4bbc62f4d9a13a756391e121
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/UnityGame/Assets/AssetBundle.meta b/UnityGame/Assets/AssetBundle.meta
new file mode 100644
index 0000000..71e76cf
--- /dev/null
+++ b/UnityGame/Assets/AssetBundle.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 6e0219d5998a4b4fb0a81b8873cf76a8
+timeCreated: 1752545025
\ No newline at end of file
diff --git a/UnityGame/Assets/AssetBundle/Config.meta b/UnityGame/Assets/AssetBundle/Config.meta
new file mode 100644
index 0000000..3f8aae5
--- /dev/null
+++ b/UnityGame/Assets/AssetBundle/Config.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 076075b24a334ecda5ad3cf5ee387e84
+timeCreated: 1752545034
\ No newline at end of file
diff --git a/UnityGame/Assets/AssetBundle/Config/demo_tbitem.bytes b/UnityGame/Assets/AssetBundle/Config/demo_tbitem.bytes
new file mode 100644
index 0000000..6db22b4
--- /dev/null
+++ b/UnityGame/Assets/AssetBundle/Config/demo_tbitem.bytes
@@ -0,0 +1,2 @@
+道具1描述1
+道具2描述2d
\ No newline at end of file
diff --git a/UnityGame/Assets/AssetBundle/Config/demo_tbitem.bytes.meta b/UnityGame/Assets/AssetBundle/Config/demo_tbitem.bytes.meta
new file mode 100644
index 0000000..d689ce7
--- /dev/null
+++ b/UnityGame/Assets/AssetBundle/Config/demo_tbitem.bytes.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 7bff501078c798e41b3b26d474f93afe
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/UnityGame/Assets/AssetBundle/FairyGUI.meta b/UnityGame/Assets/AssetBundle/FairyGUI.meta
new file mode 100644
index 0000000..f6652b8
--- /dev/null
+++ b/UnityGame/Assets/AssetBundle/FairyGUI.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: c0363c8373f64f81b928e138fa8fe50d
+timeCreated: 1752545049
\ No newline at end of file
diff --git a/UnityGame/Assets/AssetBundle/FairyGUI/Main_fui.bytes b/UnityGame/Assets/AssetBundle/FairyGUI/Main_fui.bytes
new file mode 100644
index 0000000..320d5c7
Binary files /dev/null and b/UnityGame/Assets/AssetBundle/FairyGUI/Main_fui.bytes differ
diff --git a/UnityGame/Assets/AssetBundle/FairyGUI/Main_fui.bytes.meta b/UnityGame/Assets/AssetBundle/FairyGUI/Main_fui.bytes.meta
new file mode 100644
index 0000000..1e2e4bf
--- /dev/null
+++ b/UnityGame/Assets/AssetBundle/FairyGUI/Main_fui.bytes.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: f70bfa432436406478e58fb234beec9c
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/UnityGame/Assets/Scenes.meta b/UnityGame/Assets/Scenes.meta
new file mode 100644
index 0000000..7baa9e1
--- /dev/null
+++ b/UnityGame/Assets/Scenes.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 16cbe278068f007448569de6f69dae6b
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/UnityGame/Assets/Scenes/MainScene.unity b/UnityGame/Assets/Scenes/MainScene.unity
new file mode 100644
index 0000000..1817132
--- /dev/null
+++ b/UnityGame/Assets/Scenes/MainScene.unity
@@ -0,0 +1,361 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!29 &1
+OcclusionCullingSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_OcclusionBakeSettings:
+ smallestOccluder: 5
+ smallestHole: 0.25
+ backfaceThreshold: 100
+ m_SceneGUID: 00000000000000000000000000000000
+ m_OcclusionCullingData: {fileID: 0}
+--- !u!104 &2
+RenderSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 9
+ m_Fog: 0
+ m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
+ m_FogMode: 3
+ m_FogDensity: 0.01
+ m_LinearFogStart: 0
+ m_LinearFogEnd: 300
+ m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}
+ m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
+ m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
+ m_AmbientIntensity: 1
+ m_AmbientMode: 0
+ m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
+ m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0}
+ m_HaloStrength: 0.5
+ m_FlareStrength: 1
+ m_FlareFadeSpeed: 3
+ m_HaloTexture: {fileID: 0}
+ m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
+ m_DefaultReflectionMode: 0
+ m_DefaultReflectionResolution: 128
+ m_ReflectionBounces: 1
+ m_ReflectionIntensity: 1
+ m_CustomReflection: {fileID: 0}
+ m_Sun: {fileID: 705507994}
+ m_UseRadianceAmbientProbe: 0
+--- !u!157 &3
+LightmapSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 12
+ m_GIWorkflowMode: 1
+ m_GISettings:
+ serializedVersion: 2
+ m_BounceScale: 1
+ m_IndirectOutputScale: 1
+ m_AlbedoBoost: 1
+ m_EnvironmentLightingMode: 0
+ m_EnableBakedLightmaps: 1
+ m_EnableRealtimeLightmaps: 0
+ m_LightmapEditorSettings:
+ serializedVersion: 12
+ m_Resolution: 2
+ m_BakeResolution: 40
+ m_AtlasSize: 1024
+ m_AO: 0
+ m_AOMaxDistance: 1
+ m_CompAOExponent: 1
+ m_CompAOExponentDirect: 0
+ m_ExtractAmbientOcclusion: 0
+ m_Padding: 2
+ m_LightmapParameters: {fileID: 0}
+ m_LightmapsBakeMode: 1
+ m_TextureCompression: 1
+ m_FinalGather: 0
+ m_FinalGatherFiltering: 1
+ m_FinalGatherRayCount: 256
+ m_ReflectionCompression: 2
+ m_MixedBakeMode: 2
+ m_BakeBackend: 1
+ m_PVRSampling: 1
+ m_PVRDirectSampleCount: 32
+ m_PVRSampleCount: 500
+ m_PVRBounces: 2
+ m_PVREnvironmentSampleCount: 500
+ m_PVREnvironmentReferencePointCount: 2048
+ m_PVRFilteringMode: 2
+ m_PVRDenoiserTypeDirect: 0
+ m_PVRDenoiserTypeIndirect: 0
+ m_PVRDenoiserTypeAO: 0
+ m_PVRFilterTypeDirect: 0
+ m_PVRFilterTypeIndirect: 0
+ m_PVRFilterTypeAO: 0
+ m_PVREnvironmentMIS: 0
+ m_PVRCulling: 1
+ m_PVRFilteringGaussRadiusDirect: 1
+ m_PVRFilteringGaussRadiusIndirect: 5
+ m_PVRFilteringGaussRadiusAO: 2
+ m_PVRFilteringAtrousPositionSigmaDirect: 0.5
+ m_PVRFilteringAtrousPositionSigmaIndirect: 2
+ m_PVRFilteringAtrousPositionSigmaAO: 1
+ m_ExportTrainingData: 0
+ m_TrainingDataDestination: TrainingData
+ m_LightProbeSampleCountMultiplier: 4
+ m_LightingDataAsset: {fileID: 0}
+ m_LightingSettings: {fileID: 0}
+--- !u!196 &4
+NavMeshSettings:
+ serializedVersion: 2
+ m_ObjectHideFlags: 0
+ m_BuildSettings:
+ serializedVersion: 3
+ agentTypeID: 0
+ agentRadius: 0.5
+ agentHeight: 2
+ agentSlope: 45
+ agentClimb: 0.4
+ ledgeDropHeight: 0
+ maxJumpAcrossDistance: 0
+ minRegionArea: 2
+ manualCellSize: 0
+ cellSize: 0.16666667
+ manualTileSize: 0
+ tileSize: 256
+ buildHeightMesh: 0
+ maxJobWorkers: 0
+ preserveTilesOutsideBounds: 0
+ debug:
+ m_Flags: 0
+ m_NavMeshData: {fileID: 0}
+--- !u!1 &705507993
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 705507995}
+ - component: {fileID: 705507994}
+ m_Layer: 0
+ m_Name: Directional Light
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!108 &705507994
+Light:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 705507993}
+ m_Enabled: 1
+ serializedVersion: 10
+ m_Type: 1
+ m_Shape: 0
+ m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1}
+ m_Intensity: 1
+ m_Range: 10
+ m_SpotAngle: 30
+ m_InnerSpotAngle: 21.80208
+ m_CookieSize: 10
+ m_Shadows:
+ m_Type: 2
+ m_Resolution: -1
+ m_CustomResolution: -1
+ m_Strength: 1
+ m_Bias: 0.05
+ m_NormalBias: 0.4
+ m_NearPlane: 0.2
+ m_CullingMatrixOverride:
+ e00: 1
+ e01: 0
+ e02: 0
+ e03: 0
+ e10: 0
+ e11: 1
+ e12: 0
+ e13: 0
+ e20: 0
+ e21: 0
+ e22: 1
+ e23: 0
+ e30: 0
+ e31: 0
+ e32: 0
+ e33: 1
+ m_UseCullingMatrixOverride: 0
+ m_Cookie: {fileID: 0}
+ m_DrawHalo: 0
+ m_Flare: {fileID: 0}
+ m_RenderMode: 0
+ m_CullingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+ m_RenderingLayerMask: 1
+ m_Lightmapping: 1
+ m_LightShadowCasterMode: 0
+ m_AreaSize: {x: 1, y: 1}
+ m_BounceIntensity: 1
+ m_ColorTemperature: 6570
+ m_UseColorTemperature: 0
+ m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0}
+ m_UseBoundingSphereOverride: 0
+ m_UseViewFrustumForShadowCasterCull: 1
+ m_ShadowRadius: 0
+ m_ShadowAngle: 0
+--- !u!4 &705507995
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 705507993}
+ serializedVersion: 2
+ m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261}
+ m_LocalPosition: {x: 0, y: 3, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0}
+--- !u!1 &963194225
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 963194228}
+ - component: {fileID: 963194227}
+ - component: {fileID: 963194226}
+ m_Layer: 0
+ m_Name: Main Camera
+ m_TagString: MainCamera
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!81 &963194226
+AudioListener:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 963194225}
+ m_Enabled: 1
+--- !u!20 &963194227
+Camera:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 963194225}
+ m_Enabled: 1
+ serializedVersion: 2
+ m_ClearFlags: 1
+ m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0}
+ m_projectionMatrixMode: 1
+ m_GateFitMode: 2
+ m_FOVAxisMode: 0
+ m_Iso: 200
+ m_ShutterSpeed: 0.005
+ m_Aperture: 16
+ m_FocusDistance: 10
+ m_FocalLength: 50
+ m_BladeCount: 5
+ m_Curvature: {x: 2, y: 11}
+ m_BarrelClipping: 0.25
+ m_Anamorphism: 0
+ m_SensorSize: {x: 36, y: 24}
+ m_LensShift: {x: 0, y: 0}
+ m_NormalizedViewPortRect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 1
+ height: 1
+ near clip plane: 0.3
+ far clip plane: 1000
+ field of view: 60
+ orthographic: 0
+ orthographic size: 5
+ m_Depth: -1
+ m_CullingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+ m_RenderingPath: -1
+ m_TargetTexture: {fileID: 0}
+ m_TargetDisplay: 0
+ m_TargetEye: 3
+ m_HDR: 1
+ m_AllowMSAA: 1
+ m_AllowDynamicResolution: 0
+ m_ForceIntoRT: 0
+ m_OcclusionCulling: 1
+ m_StereoConvergence: 10
+ m_StereoSeparation: 0.022
+--- !u!4 &963194228
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 963194225}
+ serializedVersion: 2
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 1, z: -10}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &1264505769
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1264505770}
+ - component: {fileID: 1264505771}
+ m_Layer: 0
+ m_Name: GameStart
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &1264505770
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1264505769}
+ serializedVersion: 2
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &1264505771
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1264505769}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: dab0061814d076f4781a6ca28229dc2b, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+--- !u!1660057539 &9223372036854775807
+SceneRoots:
+ m_ObjectHideFlags: 0
+ m_Roots:
+ - {fileID: 963194228}
+ - {fileID: 705507995}
+ - {fileID: 1264505770}
diff --git a/UnityGame/Assets/Scenes/MainScene.unity.meta b/UnityGame/Assets/Scenes/MainScene.unity.meta
new file mode 100644
index 0000000..952bd1e
--- /dev/null
+++ b/UnityGame/Assets/Scenes/MainScene.unity.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 9fc0d4010bbf28b4594072e72b8655ab
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/UnityGame/Assets/Scripts.meta b/UnityGame/Assets/Scripts.meta
new file mode 100644
index 0000000..c801cc1
--- /dev/null
+++ b/UnityGame/Assets/Scripts.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 402cebecaccdf5944aaa6170add6c92b
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/UnityGame/Assets/Scripts/GameLogic.meta b/UnityGame/Assets/Scripts/GameLogic.meta
new file mode 100644
index 0000000..eeb5a28
--- /dev/null
+++ b/UnityGame/Assets/Scripts/GameLogic.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 1dce5d6d618839f4f9e0e9d32c5d0699
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/UnityGame/Assets/Scripts/GameLogic/Export.meta b/UnityGame/Assets/Scripts/GameLogic/Export.meta
new file mode 100644
index 0000000..b938346
--- /dev/null
+++ b/UnityGame/Assets/Scripts/GameLogic/Export.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: b32bd69d879747c8bdf5a3e8c313560c
+timeCreated: 1752544984
\ No newline at end of file
diff --git a/UnityGame/Assets/Scripts/GameLogic/Export/Config.meta b/UnityGame/Assets/Scripts/GameLogic/Export/Config.meta
new file mode 100644
index 0000000..27dde18
--- /dev/null
+++ b/UnityGame/Assets/Scripts/GameLogic/Export/Config.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 7ae98d1b6ba74880a5bdbd3cefd09faa
+timeCreated: 1752544970
\ No newline at end of file
diff --git a/UnityGame/Assets/Scripts/GameLogic/Export/Config/Tables.cs b/UnityGame/Assets/Scripts/GameLogic/Export/Config/Tables.cs
new file mode 100644
index 0000000..f8a1f2f
--- /dev/null
+++ b/UnityGame/Assets/Scripts/GameLogic/Export/Config/Tables.cs
@@ -0,0 +1,30 @@
+
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+using Luban;
+
+namespace cfg
+{
+public partial class Tables
+{
+ public demo.Tbitem Tbitem {get; }
+
+ public Tables(System.Func loader)
+ {
+ Tbitem = new demo.Tbitem(loader("demo_tbitem"));
+ ResolveRef();
+ }
+
+ private void ResolveRef()
+ {
+ Tbitem.ResolveRef(this);
+ }
+}
+
+}
diff --git a/UnityGame/Assets/Scripts/GameLogic/Export/Config/Tables.cs.meta b/UnityGame/Assets/Scripts/GameLogic/Export/Config/Tables.cs.meta
new file mode 100644
index 0000000..c2f1673
--- /dev/null
+++ b/UnityGame/Assets/Scripts/GameLogic/Export/Config/Tables.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: b01c530301ff8ad4191edef0fdbb9434
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/UnityGame/Assets/Scripts/GameLogic/Export/Config/demo.meta b/UnityGame/Assets/Scripts/GameLogic/Export/Config/demo.meta
new file mode 100644
index 0000000..25d8e04
--- /dev/null
+++ b/UnityGame/Assets/Scripts/GameLogic/Export/Config/demo.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 4606e615a92487b4a8278a39cd4e8050
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/UnityGame/Assets/Scripts/GameLogic/Export/Config/demo/Tbitem.cs b/UnityGame/Assets/Scripts/GameLogic/Export/Config/demo/Tbitem.cs
new file mode 100644
index 0000000..ac2b195
--- /dev/null
+++ b/UnityGame/Assets/Scripts/GameLogic/Export/Config/demo/Tbitem.cs
@@ -0,0 +1,52 @@
+
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+using Luban;
+
+
+namespace cfg.demo
+{
+public partial class Tbitem
+{
+ private readonly System.Collections.Generic.Dictionary _dataMap;
+ private readonly System.Collections.Generic.List _dataList;
+
+ public Tbitem(ByteBuf _buf)
+ {
+ _dataMap = new System.Collections.Generic.Dictionary();
+ _dataList = new System.Collections.Generic.List();
+
+ for(int n = _buf.ReadSize() ; n > 0 ; --n)
+ {
+ demo.item _v;
+ _v = global::cfg.demo.item.Deserializeitem(_buf);
+ _dataList.Add(_v);
+ _dataMap.Add(_v.Id, _v);
+ }
+ }
+
+ public System.Collections.Generic.Dictionary DataMap => _dataMap;
+ public System.Collections.Generic.List DataList => _dataList;
+
+ public demo.item GetOrDefault(int key) => _dataMap.TryGetValue(key, out var v) ? v : null;
+ public demo.item Get(int key) => _dataMap[key];
+ public demo.item this[int key] => _dataMap[key];
+
+ public void ResolveRef(Tables tables)
+ {
+ foreach(var _v in _dataList)
+ {
+ _v.ResolveRef(tables);
+ }
+ }
+
+}
+
+}
+
diff --git a/UnityGame/Assets/Scripts/GameLogic/Export/Config/demo/Tbitem.cs.meta b/UnityGame/Assets/Scripts/GameLogic/Export/Config/demo/Tbitem.cs.meta
new file mode 100644
index 0000000..1922c9f
--- /dev/null
+++ b/UnityGame/Assets/Scripts/GameLogic/Export/Config/demo/Tbitem.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 4efa3e31c10cd944985ab8bda2628e1a
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/UnityGame/Assets/Scripts/GameLogic/Export/Config/demo/item.cs b/UnityGame/Assets/Scripts/GameLogic/Export/Config/demo/item.cs
new file mode 100644
index 0000000..cd7ec13
--- /dev/null
+++ b/UnityGame/Assets/Scripts/GameLogic/Export/Config/demo/item.cs
@@ -0,0 +1,65 @@
+
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+using Luban;
+
+
+namespace cfg.demo
+{
+public sealed partial class item : Luban.BeanBase
+{
+ public item(ByteBuf _buf)
+ {
+ Id = _buf.ReadInt();
+ Name = _buf.ReadString();
+ Desc = _buf.ReadString();
+ Count = _buf.ReadInt();
+ }
+
+ public static item Deserializeitem(ByteBuf _buf)
+ {
+ return new demo.item(_buf);
+ }
+
+ ///
+ /// id
+ ///
+ public readonly int Id;
+ ///
+ /// 名称
+ ///
+ public readonly string Name;
+ ///
+ /// 描述
+ ///
+ public readonly string Desc;
+ ///
+ /// 个数
+ ///
+ public readonly int Count;
+
+ public const int __ID__ = 750578750;
+ public override int GetTypeId() => __ID__;
+
+ public void ResolveRef(Tables tables)
+ {
+ }
+
+ public override string ToString()
+ {
+ return "{ "
+ + "id:" + Id + ","
+ + "name:" + Name + ","
+ + "desc:" + Desc + ","
+ + "count:" + Count + ","
+ + "}";
+ }
+}
+}
+
diff --git a/UnityGame/Assets/Scripts/GameLogic/Export/Config/demo/item.cs.meta b/UnityGame/Assets/Scripts/GameLogic/Export/Config/demo/item.cs.meta
new file mode 100644
index 0000000..dfe9f7e
--- /dev/null
+++ b/UnityGame/Assets/Scripts/GameLogic/Export/Config/demo/item.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: a7df9262867985e4cb8dd577a4177710
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/UnityGame/Assets/Scripts/GameLogic/Export/Config/vector2.cs b/UnityGame/Assets/Scripts/GameLogic/Export/Config/vector2.cs
new file mode 100644
index 0000000..1b22093
--- /dev/null
+++ b/UnityGame/Assets/Scripts/GameLogic/Export/Config/vector2.cs
@@ -0,0 +1,45 @@
+
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+using Luban;
+
+
+namespace cfg
+{
+public partial struct vector2
+{
+ public vector2(ByteBuf _buf)
+ {
+ X = _buf.ReadFloat();
+ Y = _buf.ReadFloat();
+ }
+
+ public static vector2 Deserializevector2(ByteBuf _buf)
+ {
+ return new vector2(_buf);
+ }
+
+ public readonly float X;
+ public readonly float Y;
+
+
+ public void ResolveRef(Tables tables)
+ {
+ }
+
+ public override string ToString()
+ {
+ return "{ "
+ + "x:" + X + ","
+ + "y:" + Y + ","
+ + "}";
+ }
+}
+}
+
diff --git a/UnityGame/Assets/Scripts/GameLogic/Export/Config/vector2.cs.meta b/UnityGame/Assets/Scripts/GameLogic/Export/Config/vector2.cs.meta
new file mode 100644
index 0000000..38c78ce
--- /dev/null
+++ b/UnityGame/Assets/Scripts/GameLogic/Export/Config/vector2.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 43eea21323b017e498f0f0f6de63abf7
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/UnityGame/Assets/Scripts/GameLogic/Export/Config/vector3.cs b/UnityGame/Assets/Scripts/GameLogic/Export/Config/vector3.cs
new file mode 100644
index 0000000..1cc18d9
--- /dev/null
+++ b/UnityGame/Assets/Scripts/GameLogic/Export/Config/vector3.cs
@@ -0,0 +1,48 @@
+
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+using Luban;
+
+
+namespace cfg
+{
+public partial struct vector3
+{
+ public vector3(ByteBuf _buf)
+ {
+ X = _buf.ReadFloat();
+ Y = _buf.ReadFloat();
+ Z = _buf.ReadFloat();
+ }
+
+ public static vector3 Deserializevector3(ByteBuf _buf)
+ {
+ return new vector3(_buf);
+ }
+
+ public readonly float X;
+ public readonly float Y;
+ public readonly float Z;
+
+
+ public void ResolveRef(Tables tables)
+ {
+ }
+
+ public override string ToString()
+ {
+ return "{ "
+ + "x:" + X + ","
+ + "y:" + Y + ","
+ + "z:" + Z + ","
+ + "}";
+ }
+}
+}
+
diff --git a/UnityGame/Assets/Scripts/GameLogic/Export/Config/vector3.cs.meta b/UnityGame/Assets/Scripts/GameLogic/Export/Config/vector3.cs.meta
new file mode 100644
index 0000000..85c16c9
--- /dev/null
+++ b/UnityGame/Assets/Scripts/GameLogic/Export/Config/vector3.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 76805dce6fb46a24d9adcbe822387088
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/UnityGame/Assets/Scripts/GameLogic/Export/Config/vector4.cs b/UnityGame/Assets/Scripts/GameLogic/Export/Config/vector4.cs
new file mode 100644
index 0000000..3b33e38
--- /dev/null
+++ b/UnityGame/Assets/Scripts/GameLogic/Export/Config/vector4.cs
@@ -0,0 +1,51 @@
+
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+using Luban;
+
+
+namespace cfg
+{
+public partial struct vector4
+{
+ public vector4(ByteBuf _buf)
+ {
+ X = _buf.ReadFloat();
+ Y = _buf.ReadFloat();
+ Z = _buf.ReadFloat();
+ W = _buf.ReadFloat();
+ }
+
+ public static vector4 Deserializevector4(ByteBuf _buf)
+ {
+ return new vector4(_buf);
+ }
+
+ public readonly float X;
+ public readonly float Y;
+ public readonly float Z;
+ public readonly float W;
+
+
+ public void ResolveRef(Tables tables)
+ {
+ }
+
+ public override string ToString()
+ {
+ return "{ "
+ + "x:" + X + ","
+ + "y:" + Y + ","
+ + "z:" + Z + ","
+ + "w:" + W + ","
+ + "}";
+ }
+}
+}
+
diff --git a/UnityGame/Assets/Scripts/GameLogic/Export/Config/vector4.cs.meta b/UnityGame/Assets/Scripts/GameLogic/Export/Config/vector4.cs.meta
new file mode 100644
index 0000000..f3501f1
--- /dev/null
+++ b/UnityGame/Assets/Scripts/GameLogic/Export/Config/vector4.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: d8b419c77ca0c9847ab9b9bf509dc546
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/UnityGame/Assets/Scripts/GameLogic/Export/UI.meta b/UnityGame/Assets/Scripts/GameLogic/Export/UI.meta
new file mode 100644
index 0000000..71902a7
--- /dev/null
+++ b/UnityGame/Assets/Scripts/GameLogic/Export/UI.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 5a8878e677b5471ab41dd9aa5de372cc
+timeCreated: 1752544999
\ No newline at end of file
diff --git a/UnityGame/Assets/Scripts/GameLogic/GameLogic.cs b/UnityGame/Assets/Scripts/GameLogic/GameLogic.cs
new file mode 100644
index 0000000..24c0c96
--- /dev/null
+++ b/UnityGame/Assets/Scripts/GameLogic/GameLogic.cs
@@ -0,0 +1,8 @@
+namespace CreatGame
+{
+ public class GameLogic
+ {
+
+ }
+}
+
diff --git a/UnityGame/Assets/Scripts/GameLogic/GameLogic.cs.meta b/UnityGame/Assets/Scripts/GameLogic/GameLogic.cs.meta
new file mode 100644
index 0000000..9bb043e
--- /dev/null
+++ b/UnityGame/Assets/Scripts/GameLogic/GameLogic.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 8bed5572501d4f149c84589085bec321
+timeCreated: 1752463362
\ No newline at end of file
diff --git a/UnityGame/Assets/Scripts/GameLogic/Tools.meta b/UnityGame/Assets/Scripts/GameLogic/Tools.meta
new file mode 100644
index 0000000..246676f
--- /dev/null
+++ b/UnityGame/Assets/Scripts/GameLogic/Tools.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 341fa7946cf046c1ae980f1f3efabbda
+timeCreated: 1752547061
\ No newline at end of file
diff --git a/UnityGame/Assets/Scripts/GameLogic/Tools/AssetBundle.meta b/UnityGame/Assets/Scripts/GameLogic/Tools/AssetBundle.meta
new file mode 100644
index 0000000..3634c6a
--- /dev/null
+++ b/UnityGame/Assets/Scripts/GameLogic/Tools/AssetBundle.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 12e2e1bf012c4e74951a89b77d46f08c
+timeCreated: 1752547082
\ No newline at end of file
diff --git a/UnityGame/Assets/Scripts/GameLogic/Tools/AssetBundle/AddressableUpdater.cs b/UnityGame/Assets/Scripts/GameLogic/Tools/AssetBundle/AddressableUpdater.cs
new file mode 100644
index 0000000..4ddab8d
--- /dev/null
+++ b/UnityGame/Assets/Scripts/GameLogic/Tools/AssetBundle/AddressableUpdater.cs
@@ -0,0 +1,101 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.AddressableAssets;
+using UnityEngine.AddressableAssets.ResourceLocators;
+using UnityEngine.ResourceManagement.ResourceLocations;
+using UnityEngine.ResourceManagement.AsyncOperations;
+using UnityEngine.ResourceManagement.ResourceProviders;
+
+public class AddressableUpdater : MonoBehaviour
+{
+ public string remoteCatalogUrl; // CDN catalog 路径
+
+ public Action OnProgressChanged; // 进度更新回调 0~1
+ public Action OnSpeedChanged; // 下载速度更新 (KB/s)
+ public Action OnDownloadSizeFetched; // 总下载大小回调 (MB)
+ public Action OnCompleted; // 下载完成
+
+ private float lastDownloadedBytes = 0;
+ private float updateCheckInterval = 0.5f;
+
+ void Start()
+ {
+ StartCoroutine(UpdateAddressables());
+ }
+
+ IEnumerator UpdateAddressables()
+ {
+ // 1. 初始化 Addressables
+ var initHandle = Addressables.InitializeAsync();
+ yield return initHandle;
+
+ // 2. 更新 Catalog
+ var catalogHandle = Addressables.UpdateCatalogs();
+ yield return catalogHandle;
+
+ List catalogs = catalogHandle.Result;
+
+ // 3. 获取资源下载大小
+ var sizeHandle = Addressables.GetDownloadSizeAsync(Addressables.ResourceManager.ResourceProviders);
+ yield return sizeHandle;
+
+ long totalDownloadSize = sizeHandle.Result;
+
+ if (totalDownloadSize <= 0)
+ {
+ Debug.Log("无需更新");
+ OnCompleted?.Invoke();
+ yield break;
+ }
+
+ OnDownloadSizeFetched?.Invoke(totalDownloadSize / (1024f * 1024f)); // MB
+
+ // 4. 开始下载所有资源
+ var downloadHandle = Addressables.DownloadDependenciesAsync(Addressables.ResourceManager.ResourceProviders, true);
+ StartCoroutine(TrackDownloadProgress(downloadHandle, totalDownloadSize));
+ yield return downloadHandle;
+
+ if (downloadHandle.Status == AsyncOperationStatus.Succeeded)
+ {
+ Debug.Log("热更完成!");
+ OnCompleted?.Invoke();
+ }
+ else
+ {
+ Debug.LogError("热更失败!");
+ }
+ }
+
+ IEnumerator TrackDownloadProgress(AsyncOperationHandle handle, long totalSize)
+ {
+ float lastTime = Time.realtimeSinceStartup;
+ float lastDownloaded = 0;
+
+ while (!handle.IsDone)
+ {
+ float percent = handle.PercentComplete;
+ OnProgressChanged?.Invoke(percent);
+
+ float currentTime = Time.realtimeSinceStartup;
+ float elapsed = currentTime - lastTime;
+
+ if (elapsed >= updateCheckInterval)
+ {
+ float currentDownloaded = percent * totalSize;
+ float speed = (currentDownloaded - lastDownloaded) / elapsed / 1024f; // KB/s
+
+ OnSpeedChanged?.Invoke(speed);
+
+ lastTime = currentTime;
+ lastDownloaded = currentDownloaded;
+ }
+
+ yield return null;
+ }
+
+ OnProgressChanged?.Invoke(1f);
+ OnSpeedChanged?.Invoke(0);
+ }
+}
diff --git a/UnityGame/Assets/Scripts/GameLogic/Tools/AssetBundle/AddressableUpdater.cs.meta b/UnityGame/Assets/Scripts/GameLogic/Tools/AssetBundle/AddressableUpdater.cs.meta
new file mode 100644
index 0000000..4abe0a9
--- /dev/null
+++ b/UnityGame/Assets/Scripts/GameLogic/Tools/AssetBundle/AddressableUpdater.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 2bbf6478f2ed4dd0ac123f2a03fe3695
+timeCreated: 1752549280
\ No newline at end of file
diff --git a/UnityGame/Assets/Scripts/GameLogic/Tools/AssetBundle/AssetBundleManager.cs b/UnityGame/Assets/Scripts/GameLogic/Tools/AssetBundle/AssetBundleManager.cs
new file mode 100644
index 0000000..b67e955
--- /dev/null
+++ b/UnityGame/Assets/Scripts/GameLogic/Tools/AssetBundle/AssetBundleManager.cs
@@ -0,0 +1,13 @@
+namespace CreatGame.AssetBundle
+{
+ public class AssetBundleManager : Singleton
+ {
+ ///
+ /// 需要初始化Addressble系统
+ ///
+ public AssetBundleManager()
+ {
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/UnityGame/Assets/Scripts/GameLogic/Tools/AssetBundle/AssetBundleManager.cs.meta b/UnityGame/Assets/Scripts/GameLogic/Tools/AssetBundle/AssetBundleManager.cs.meta
new file mode 100644
index 0000000..a67f6b6
--- /dev/null
+++ b/UnityGame/Assets/Scripts/GameLogic/Tools/AssetBundle/AssetBundleManager.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 01bfbdbb68f24f39bf248e1ce2907783
+timeCreated: 1752547273
\ No newline at end of file
diff --git a/UnityGame/Assets/Scripts/GameLogic/Tools/Config.meta b/UnityGame/Assets/Scripts/GameLogic/Tools/Config.meta
new file mode 100644
index 0000000..696ec57
--- /dev/null
+++ b/UnityGame/Assets/Scripts/GameLogic/Tools/Config.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 726911973e4b4b129678928347fc1de4
+timeCreated: 1752547090
\ No newline at end of file
diff --git a/UnityGame/Assets/Scripts/GameLogic/Tools/FairyGUI.meta b/UnityGame/Assets/Scripts/GameLogic/Tools/FairyGUI.meta
new file mode 100644
index 0000000..e9fa70a
--- /dev/null
+++ b/UnityGame/Assets/Scripts/GameLogic/Tools/FairyGUI.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 8f912db237c54e96b83e9c11a7ab6889
+timeCreated: 1752547100
\ No newline at end of file
diff --git a/UnityGame/Assets/Scripts/GameLogic/UI.meta b/UnityGame/Assets/Scripts/GameLogic/UI.meta
new file mode 100644
index 0000000..f6e908b
--- /dev/null
+++ b/UnityGame/Assets/Scripts/GameLogic/UI.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: f208809c54934f6f911cc29d97c3519a
+timeCreated: 1752550099
\ No newline at end of file
diff --git a/UnityGame/Assets/Scripts/GameLogic/UI/UIEnum.cs b/UnityGame/Assets/Scripts/GameLogic/UI/UIEnum.cs
new file mode 100644
index 0000000..224d21b
--- /dev/null
+++ b/UnityGame/Assets/Scripts/GameLogic/UI/UIEnum.cs
@@ -0,0 +1,13 @@
+namespace CreatGame.UI
+{
+ ///
+ /// 窗口层级
+ ///
+ public enum UILayer
+ {
+ Main,
+ Popup,
+ Notify,
+ System,
+ }
+}
\ No newline at end of file
diff --git a/UnityGame/Assets/Scripts/GameLogic/UI/UIEnum.cs.meta b/UnityGame/Assets/Scripts/GameLogic/UI/UIEnum.cs.meta
new file mode 100644
index 0000000..e73d8f9
--- /dev/null
+++ b/UnityGame/Assets/Scripts/GameLogic/UI/UIEnum.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: a02dc47e9bb442079f60800e51c49b6e
+timeCreated: 1752551035
\ No newline at end of file
diff --git a/UnityGame/Assets/Scripts/GameLogic/UI/UILogic.meta b/UnityGame/Assets/Scripts/GameLogic/UI/UILogic.meta
new file mode 100644
index 0000000..ac66187
--- /dev/null
+++ b/UnityGame/Assets/Scripts/GameLogic/UI/UILogic.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 0631ad95508b427c96e7748c13e0eb59
+timeCreated: 1752550115
\ No newline at end of file
diff --git a/UnityGame/Assets/Scripts/GameLogic/UI/UIManager.cs b/UnityGame/Assets/Scripts/GameLogic/UI/UIManager.cs
new file mode 100644
index 0000000..893bac5
--- /dev/null
+++ b/UnityGame/Assets/Scripts/GameLogic/UI/UIManager.cs
@@ -0,0 +1,16 @@
+using System.Collections.Generic;
+
+namespace CreatGame.UI
+{
+ public class UIManager : Singleton
+ {
+
+ private Dictionary> m_Windows;
+ ///
+ ///
+ ///
+ public UIManager()
+ {
+ }
+ }
+}
\ No newline at end of file
diff --git a/UnityGame/Assets/Scripts/GameLogic/UI/UIManager.cs.meta b/UnityGame/Assets/Scripts/GameLogic/UI/UIManager.cs.meta
new file mode 100644
index 0000000..fcf4ba0
--- /dev/null
+++ b/UnityGame/Assets/Scripts/GameLogic/UI/UIManager.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: b62361e051d040d696ac9c2485f57a3b
+timeCreated: 1752550917
\ No newline at end of file
diff --git a/UnityGame/Assets/Scripts/GameLogic/UI/UIViewBase.cs b/UnityGame/Assets/Scripts/GameLogic/UI/UIViewBase.cs
new file mode 100644
index 0000000..fa69097
--- /dev/null
+++ b/UnityGame/Assets/Scripts/GameLogic/UI/UIViewBase.cs
@@ -0,0 +1,7 @@
+namespace CreatGame.UI
+{
+ public class UIViewBase
+ {
+
+ }
+}
\ No newline at end of file
diff --git a/UnityGame/Assets/Scripts/GameLogic/UI/UIViewBase.cs.meta b/UnityGame/Assets/Scripts/GameLogic/UI/UIViewBase.cs.meta
new file mode 100644
index 0000000..59ad2c9
--- /dev/null
+++ b/UnityGame/Assets/Scripts/GameLogic/UI/UIViewBase.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: f48b029bf9fe4664a47a4ede05f4d396
+timeCreated: 1752550141
\ No newline at end of file
diff --git a/UnityGame/Assets/Scripts/GameStar.cs b/UnityGame/Assets/Scripts/GameStar.cs
new file mode 100644
index 0000000..460611c
--- /dev/null
+++ b/UnityGame/Assets/Scripts/GameStar.cs
@@ -0,0 +1,19 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class GameStar : MonoBehaviour
+{
+
+ // Start is called before the first frame update
+ void Start()
+ {
+
+ }
+
+ // Update is called once per frame
+ void Update()
+ {
+
+ }
+}
diff --git a/UnityGame/Assets/Scripts/GameStar.cs.meta b/UnityGame/Assets/Scripts/GameStar.cs.meta
new file mode 100644
index 0000000..944a450
--- /dev/null
+++ b/UnityGame/Assets/Scripts/GameStar.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: dab0061814d076f4781a6ca28229dc2b
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/UnityGame/Assets/Scripts/GameTools.meta b/UnityGame/Assets/Scripts/GameTools.meta
new file mode 100644
index 0000000..43f8882
--- /dev/null
+++ b/UnityGame/Assets/Scripts/GameTools.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 574ee34052894bd79966fa8ad35a0335
+timeCreated: 1752463436
\ No newline at end of file
diff --git a/UnityGame/Assets/Scripts/GameTools/Singleton.cs b/UnityGame/Assets/Scripts/GameTools/Singleton.cs
new file mode 100644
index 0000000..fb45f17
--- /dev/null
+++ b/UnityGame/Assets/Scripts/GameTools/Singleton.cs
@@ -0,0 +1,36 @@
+namespace CreatGame
+{
+ public class Singleton where T : class, new()
+ {
+ private static T _instance;
+ private static readonly object _lock = new object();
+
+ [UnityEngine.Scripting.Preserve]
+ protected Singleton()
+ {
+ }
+
+ ///
+ /// 单例对象(线程安全,双重锁定)
+ ///
+ [UnityEngine.Scripting.Preserve]
+ public static T Instance
+ {
+ get
+ {
+ if (_instance == null)
+ {
+ lock (_lock)
+ {
+ if (_instance == null)
+ {
+ _instance = new T();
+ }
+ }
+ }
+
+ return _instance;
+ }
+ }
+ }
+}
diff --git a/UnityGame/Assets/Scripts/GameTools/Singleton.cs.meta b/UnityGame/Assets/Scripts/GameTools/Singleton.cs.meta
new file mode 100644
index 0000000..a7f8ff6
--- /dev/null
+++ b/UnityGame/Assets/Scripts/GameTools/Singleton.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 06769352e6416554e8adc475a44e9d43
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/UnityGame/Assets/Scripts/ThirdParty.meta b/UnityGame/Assets/Scripts/ThirdParty.meta
new file mode 100644
index 0000000..39ef403
--- /dev/null
+++ b/UnityGame/Assets/Scripts/ThirdParty.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 415eab8032943c1478caff308d673788
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/UnityGame/Packages/manifest.json b/UnityGame/Packages/manifest.json
new file mode 100644
index 0000000..94b26a1
--- /dev/null
+++ b/UnityGame/Packages/manifest.json
@@ -0,0 +1,43 @@
+{
+ "dependencies": {
+ "com.code-philosophy.luban": "https://gitee.com/focus-creative-games/luban_unity.git",
+ "com.unity.addressables": "1.22.3",
+ "com.unity.collab-proxy": "2.8.2",
+ "com.unity.feature.development": "1.0.1",
+ "com.unity.textmeshpro": "3.0.7",
+ "com.unity.timeline": "1.7.6",
+ "com.unity.ugui": "1.0.0",
+ "com.unity.visualscripting": "1.9.4",
+ "com.unity.modules.ai": "1.0.0",
+ "com.unity.modules.androidjni": "1.0.0",
+ "com.unity.modules.animation": "1.0.0",
+ "com.unity.modules.assetbundle": "1.0.0",
+ "com.unity.modules.audio": "1.0.0",
+ "com.unity.modules.cloth": "1.0.0",
+ "com.unity.modules.director": "1.0.0",
+ "com.unity.modules.imageconversion": "1.0.0",
+ "com.unity.modules.imgui": "1.0.0",
+ "com.unity.modules.jsonserialize": "1.0.0",
+ "com.unity.modules.particlesystem": "1.0.0",
+ "com.unity.modules.physics": "1.0.0",
+ "com.unity.modules.physics2d": "1.0.0",
+ "com.unity.modules.screencapture": "1.0.0",
+ "com.unity.modules.terrain": "1.0.0",
+ "com.unity.modules.terrainphysics": "1.0.0",
+ "com.unity.modules.tilemap": "1.0.0",
+ "com.unity.modules.ui": "1.0.0",
+ "com.unity.modules.uielements": "1.0.0",
+ "com.unity.modules.umbra": "1.0.0",
+ "com.unity.modules.unityanalytics": "1.0.0",
+ "com.unity.modules.unitywebrequest": "1.0.0",
+ "com.unity.modules.unitywebrequestassetbundle": "1.0.0",
+ "com.unity.modules.unitywebrequestaudio": "1.0.0",
+ "com.unity.modules.unitywebrequesttexture": "1.0.0",
+ "com.unity.modules.unitywebrequestwww": "1.0.0",
+ "com.unity.modules.vehicles": "1.0.0",
+ "com.unity.modules.video": "1.0.0",
+ "com.unity.modules.vr": "1.0.0",
+ "com.unity.modules.wind": "1.0.0",
+ "com.unity.modules.xr": "1.0.0"
+ }
+}
diff --git a/UnityGame/Packages/packages-lock.json b/UnityGame/Packages/packages-lock.json
new file mode 100644
index 0000000..380c39f
--- /dev/null
+++ b/UnityGame/Packages/packages-lock.json
@@ -0,0 +1,410 @@
+{
+ "dependencies": {
+ "com.code-philosophy.luban": {
+ "version": "https://gitee.com/focus-creative-games/luban_unity.git",
+ "depth": 0,
+ "source": "git",
+ "dependencies": {},
+ "hash": "57e577126c4bac9abef927babb848a457ad5d563"
+ },
+ "com.unity.addressables": {
+ "version": "1.22.3",
+ "depth": 0,
+ "source": "registry",
+ "dependencies": {
+ "com.unity.modules.assetbundle": "1.0.0",
+ "com.unity.modules.jsonserialize": "1.0.0",
+ "com.unity.modules.imageconversion": "1.0.0",
+ "com.unity.modules.unitywebrequest": "1.0.0",
+ "com.unity.scriptablebuildpipeline": "1.21.25",
+ "com.unity.modules.unitywebrequestassetbundle": "1.0.0"
+ },
+ "url": "https://packages.unity.com"
+ },
+ "com.unity.collab-proxy": {
+ "version": "2.8.2",
+ "depth": 0,
+ "source": "registry",
+ "dependencies": {},
+ "url": "https://packages.unity.com"
+ },
+ "com.unity.editorcoroutines": {
+ "version": "1.0.0",
+ "depth": 1,
+ "source": "registry",
+ "dependencies": {},
+ "url": "https://packages.unity.com"
+ },
+ "com.unity.ext.nunit": {
+ "version": "1.0.6",
+ "depth": 2,
+ "source": "registry",
+ "dependencies": {},
+ "url": "https://packages.unity.com"
+ },
+ "com.unity.feature.development": {
+ "version": "1.0.1",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.ide.visualstudio": "2.0.22",
+ "com.unity.ide.rider": "3.0.31",
+ "com.unity.ide.vscode": "1.2.5",
+ "com.unity.editorcoroutines": "1.0.0",
+ "com.unity.performance.profile-analyzer": "1.2.2",
+ "com.unity.test-framework": "1.1.33",
+ "com.unity.testtools.codecoverage": "1.2.6"
+ }
+ },
+ "com.unity.ide.rider": {
+ "version": "3.0.31",
+ "depth": 1,
+ "source": "registry",
+ "dependencies": {
+ "com.unity.ext.nunit": "1.0.6"
+ },
+ "url": "https://packages.unity.com"
+ },
+ "com.unity.ide.visualstudio": {
+ "version": "2.0.22",
+ "depth": 1,
+ "source": "registry",
+ "dependencies": {
+ "com.unity.test-framework": "1.1.9"
+ },
+ "url": "https://packages.unity.com"
+ },
+ "com.unity.ide.vscode": {
+ "version": "1.2.5",
+ "depth": 1,
+ "source": "registry",
+ "dependencies": {},
+ "url": "https://packages.unity.com"
+ },
+ "com.unity.performance.profile-analyzer": {
+ "version": "1.2.2",
+ "depth": 1,
+ "source": "registry",
+ "dependencies": {},
+ "url": "https://packages.unity.com"
+ },
+ "com.unity.scriptablebuildpipeline": {
+ "version": "1.21.25",
+ "depth": 1,
+ "source": "registry",
+ "dependencies": {},
+ "url": "https://packages.unity.com"
+ },
+ "com.unity.settings-manager": {
+ "version": "2.0.1",
+ "depth": 2,
+ "source": "registry",
+ "dependencies": {},
+ "url": "https://packages.unity.com"
+ },
+ "com.unity.test-framework": {
+ "version": "1.1.33",
+ "depth": 1,
+ "source": "registry",
+ "dependencies": {
+ "com.unity.ext.nunit": "1.0.6",
+ "com.unity.modules.imgui": "1.0.0",
+ "com.unity.modules.jsonserialize": "1.0.0"
+ },
+ "url": "https://packages.unity.com"
+ },
+ "com.unity.testtools.codecoverage": {
+ "version": "1.2.6",
+ "depth": 1,
+ "source": "registry",
+ "dependencies": {
+ "com.unity.test-framework": "1.0.16",
+ "com.unity.settings-manager": "1.0.1"
+ },
+ "url": "https://packages.unity.com"
+ },
+ "com.unity.textmeshpro": {
+ "version": "3.0.7",
+ "depth": 0,
+ "source": "registry",
+ "dependencies": {
+ "com.unity.ugui": "1.0.0"
+ },
+ "url": "https://packages.unity.com"
+ },
+ "com.unity.timeline": {
+ "version": "1.7.6",
+ "depth": 0,
+ "source": "registry",
+ "dependencies": {
+ "com.unity.modules.audio": "1.0.0",
+ "com.unity.modules.director": "1.0.0",
+ "com.unity.modules.animation": "1.0.0",
+ "com.unity.modules.particlesystem": "1.0.0"
+ },
+ "url": "https://packages.unity.com"
+ },
+ "com.unity.ugui": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.ui": "1.0.0",
+ "com.unity.modules.imgui": "1.0.0"
+ }
+ },
+ "com.unity.visualscripting": {
+ "version": "1.9.4",
+ "depth": 0,
+ "source": "registry",
+ "dependencies": {
+ "com.unity.ugui": "1.0.0",
+ "com.unity.modules.jsonserialize": "1.0.0"
+ },
+ "url": "https://packages.unity.com"
+ },
+ "com.unity.modules.ai": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {}
+ },
+ "com.unity.modules.androidjni": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {}
+ },
+ "com.unity.modules.animation": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {}
+ },
+ "com.unity.modules.assetbundle": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {}
+ },
+ "com.unity.modules.audio": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {}
+ },
+ "com.unity.modules.cloth": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.physics": "1.0.0"
+ }
+ },
+ "com.unity.modules.director": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.audio": "1.0.0",
+ "com.unity.modules.animation": "1.0.0"
+ }
+ },
+ "com.unity.modules.imageconversion": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {}
+ },
+ "com.unity.modules.imgui": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {}
+ },
+ "com.unity.modules.jsonserialize": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {}
+ },
+ "com.unity.modules.particlesystem": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {}
+ },
+ "com.unity.modules.physics": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {}
+ },
+ "com.unity.modules.physics2d": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {}
+ },
+ "com.unity.modules.screencapture": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.imageconversion": "1.0.0"
+ }
+ },
+ "com.unity.modules.subsystems": {
+ "version": "1.0.0",
+ "depth": 1,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.jsonserialize": "1.0.0"
+ }
+ },
+ "com.unity.modules.terrain": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {}
+ },
+ "com.unity.modules.terrainphysics": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.physics": "1.0.0",
+ "com.unity.modules.terrain": "1.0.0"
+ }
+ },
+ "com.unity.modules.tilemap": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.physics2d": "1.0.0"
+ }
+ },
+ "com.unity.modules.ui": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {}
+ },
+ "com.unity.modules.uielements": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.ui": "1.0.0",
+ "com.unity.modules.imgui": "1.0.0",
+ "com.unity.modules.jsonserialize": "1.0.0"
+ }
+ },
+ "com.unity.modules.umbra": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {}
+ },
+ "com.unity.modules.unityanalytics": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.unitywebrequest": "1.0.0",
+ "com.unity.modules.jsonserialize": "1.0.0"
+ }
+ },
+ "com.unity.modules.unitywebrequest": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {}
+ },
+ "com.unity.modules.unitywebrequestassetbundle": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.assetbundle": "1.0.0",
+ "com.unity.modules.unitywebrequest": "1.0.0"
+ }
+ },
+ "com.unity.modules.unitywebrequestaudio": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.unitywebrequest": "1.0.0",
+ "com.unity.modules.audio": "1.0.0"
+ }
+ },
+ "com.unity.modules.unitywebrequesttexture": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.unitywebrequest": "1.0.0",
+ "com.unity.modules.imageconversion": "1.0.0"
+ }
+ },
+ "com.unity.modules.unitywebrequestwww": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.unitywebrequest": "1.0.0",
+ "com.unity.modules.unitywebrequestassetbundle": "1.0.0",
+ "com.unity.modules.unitywebrequestaudio": "1.0.0",
+ "com.unity.modules.audio": "1.0.0",
+ "com.unity.modules.assetbundle": "1.0.0",
+ "com.unity.modules.imageconversion": "1.0.0"
+ }
+ },
+ "com.unity.modules.vehicles": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.physics": "1.0.0"
+ }
+ },
+ "com.unity.modules.video": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.audio": "1.0.0",
+ "com.unity.modules.ui": "1.0.0",
+ "com.unity.modules.unitywebrequest": "1.0.0"
+ }
+ },
+ "com.unity.modules.vr": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.jsonserialize": "1.0.0",
+ "com.unity.modules.physics": "1.0.0",
+ "com.unity.modules.xr": "1.0.0"
+ }
+ },
+ "com.unity.modules.wind": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {}
+ },
+ "com.unity.modules.xr": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.physics": "1.0.0",
+ "com.unity.modules.jsonserialize": "1.0.0",
+ "com.unity.modules.subsystems": "1.0.0"
+ }
+ }
+ }
+}
diff --git a/UnityGame/ProjectSettings/AudioManager.asset b/UnityGame/ProjectSettings/AudioManager.asset
new file mode 100644
index 0000000..07ebfb0
--- /dev/null
+++ b/UnityGame/ProjectSettings/AudioManager.asset
@@ -0,0 +1,19 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!11 &1
+AudioManager:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_Volume: 1
+ Rolloff Scale: 1
+ Doppler Factor: 1
+ Default Speaker Mode: 2
+ m_SampleRate: 0
+ m_DSPBufferSize: 1024
+ m_VirtualVoiceCount: 512
+ m_RealVoiceCount: 32
+ m_SpatializerPlugin:
+ m_AmbisonicDecoderPlugin:
+ m_DisableAudio: 0
+ m_VirtualizeEffects: 1
+ m_RequestedDSPBufferSize: 1024
diff --git a/UnityGame/ProjectSettings/ClusterInputManager.asset b/UnityGame/ProjectSettings/ClusterInputManager.asset
new file mode 100644
index 0000000..e7886b2
--- /dev/null
+++ b/UnityGame/ProjectSettings/ClusterInputManager.asset
@@ -0,0 +1,6 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!236 &1
+ClusterInputManager:
+ m_ObjectHideFlags: 0
+ m_Inputs: []
diff --git a/UnityGame/ProjectSettings/DynamicsManager.asset b/UnityGame/ProjectSettings/DynamicsManager.asset
new file mode 100644
index 0000000..cdc1f3e
--- /dev/null
+++ b/UnityGame/ProjectSettings/DynamicsManager.asset
@@ -0,0 +1,34 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!55 &1
+PhysicsManager:
+ m_ObjectHideFlags: 0
+ serializedVersion: 11
+ m_Gravity: {x: 0, y: -9.81, z: 0}
+ m_DefaultMaterial: {fileID: 0}
+ m_BounceThreshold: 2
+ m_SleepThreshold: 0.005
+ m_DefaultContactOffset: 0.01
+ m_DefaultSolverIterations: 6
+ m_DefaultSolverVelocityIterations: 1
+ m_QueriesHitBackfaces: 0
+ m_QueriesHitTriggers: 1
+ m_EnableAdaptiveForce: 0
+ m_ClothInterCollisionDistance: 0
+ m_ClothInterCollisionStiffness: 0
+ m_ContactsGeneration: 1
+ m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ m_AutoSimulation: 1
+ m_AutoSyncTransforms: 0
+ m_ReuseCollisionCallbacks: 1
+ m_ClothInterCollisionSettingsToggle: 0
+ m_ContactPairsMode: 0
+ m_BroadphaseType: 0
+ m_WorldBounds:
+ m_Center: {x: 0, y: 0, z: 0}
+ m_Extent: {x: 250, y: 250, z: 250}
+ m_WorldSubdivisions: 8
+ m_FrictionType: 0
+ m_EnableEnhancedDeterminism: 0
+ m_EnableUnifiedHeightmaps: 1
+ m_DefaultMaxAngluarSpeed: 7
diff --git a/UnityGame/ProjectSettings/EditorBuildSettings.asset b/UnityGame/ProjectSettings/EditorBuildSettings.asset
new file mode 100644
index 0000000..48ec629
--- /dev/null
+++ b/UnityGame/ProjectSettings/EditorBuildSettings.asset
@@ -0,0 +1,9 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1045 &1
+EditorBuildSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_Scenes: []
+ m_configObjects:
+ com.unity.addressableassets: {fileID: 11400000, guid: 99d814bd438c51f4385a7705369b0a13, type: 2}
diff --git a/UnityGame/ProjectSettings/EditorSettings.asset b/UnityGame/ProjectSettings/EditorSettings.asset
new file mode 100644
index 0000000..1e44a0a
--- /dev/null
+++ b/UnityGame/ProjectSettings/EditorSettings.asset
@@ -0,0 +1,30 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!159 &1
+EditorSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 11
+ m_ExternalVersionControlSupport: Visible Meta Files
+ m_SerializationMode: 2
+ m_LineEndingsForNewScripts: 0
+ m_DefaultBehaviorMode: 0
+ m_PrefabRegularEnvironment: {fileID: 0}
+ m_PrefabUIEnvironment: {fileID: 0}
+ m_SpritePackerMode: 0
+ m_SpritePackerPaddingPower: 1
+ m_EtcTextureCompressorBehavior: 1
+ m_EtcTextureFastCompressor: 1
+ m_EtcTextureNormalCompressor: 2
+ m_EtcTextureBestCompressor: 4
+ m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd;asmdef;rsp;asmref
+ m_ProjectGenerationRootNamespace:
+ m_CollabEditorSettings:
+ inProgressEnabled: 1
+ m_EnableTextureStreamingInEditMode: 1
+ m_EnableTextureStreamingInPlayMode: 1
+ m_AsyncShaderCompilation: 1
+ m_EnterPlayModeOptionsEnabled: 0
+ m_EnterPlayModeOptions: 3
+ m_ShowLightmapResolutionOverlay: 1
+ m_UseLegacyProbeSampleCount: 0
+ m_SerializeInlineMappingsOnOneLine: 1
diff --git a/UnityGame/ProjectSettings/GraphicsSettings.asset b/UnityGame/ProjectSettings/GraphicsSettings.asset
new file mode 100644
index 0000000..43369e3
--- /dev/null
+++ b/UnityGame/ProjectSettings/GraphicsSettings.asset
@@ -0,0 +1,63 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!30 &1
+GraphicsSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 13
+ m_Deferred:
+ m_Mode: 1
+ m_Shader: {fileID: 69, guid: 0000000000000000f000000000000000, type: 0}
+ m_DeferredReflections:
+ m_Mode: 1
+ m_Shader: {fileID: 74, guid: 0000000000000000f000000000000000, type: 0}
+ m_ScreenSpaceShadows:
+ m_Mode: 1
+ m_Shader: {fileID: 64, guid: 0000000000000000f000000000000000, type: 0}
+ m_LegacyDeferred:
+ m_Mode: 1
+ m_Shader: {fileID: 63, guid: 0000000000000000f000000000000000, type: 0}
+ m_DepthNormals:
+ m_Mode: 1
+ m_Shader: {fileID: 62, guid: 0000000000000000f000000000000000, type: 0}
+ m_MotionVectors:
+ m_Mode: 1
+ m_Shader: {fileID: 75, guid: 0000000000000000f000000000000000, type: 0}
+ m_LightHalo:
+ m_Mode: 1
+ m_Shader: {fileID: 105, guid: 0000000000000000f000000000000000, type: 0}
+ m_LensFlare:
+ m_Mode: 1
+ m_Shader: {fileID: 102, guid: 0000000000000000f000000000000000, type: 0}
+ m_AlwaysIncludedShaders:
+ - {fileID: 7, guid: 0000000000000000f000000000000000, type: 0}
+ - {fileID: 15104, guid: 0000000000000000f000000000000000, type: 0}
+ - {fileID: 15105, guid: 0000000000000000f000000000000000, type: 0}
+ - {fileID: 15106, guid: 0000000000000000f000000000000000, type: 0}
+ - {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0}
+ - {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0}
+ m_PreloadedShaders: []
+ m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000,
+ type: 0}
+ m_CustomRenderPipeline: {fileID: 0}
+ m_TransparencySortMode: 0
+ m_TransparencySortAxis: {x: 0, y: 0, z: 1}
+ m_DefaultRenderingPath: 1
+ m_DefaultMobileRenderingPath: 1
+ m_TierSettings: []
+ m_LightmapStripping: 0
+ m_FogStripping: 0
+ m_InstancingStripping: 0
+ m_LightmapKeepPlain: 1
+ m_LightmapKeepDirCombined: 1
+ m_LightmapKeepDynamicPlain: 1
+ m_LightmapKeepDynamicDirCombined: 1
+ m_LightmapKeepShadowMask: 1
+ m_LightmapKeepSubtractive: 1
+ m_FogKeepLinear: 1
+ m_FogKeepExp: 1
+ m_FogKeepExp2: 1
+ m_AlbedoSwatchInfos: []
+ m_LightsUseLinearIntensity: 0
+ m_LightsUseColorTemperature: 0
+ m_LogWhenShaderIsCompiled: 0
+ m_AllowEnlightenSupportForUpgradedProject: 0
diff --git a/UnityGame/ProjectSettings/InputManager.asset b/UnityGame/ProjectSettings/InputManager.asset
new file mode 100644
index 0000000..17c8f53
--- /dev/null
+++ b/UnityGame/ProjectSettings/InputManager.asset
@@ -0,0 +1,295 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!13 &1
+InputManager:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_Axes:
+ - serializedVersion: 3
+ m_Name: Horizontal
+ descriptiveName:
+ descriptiveNegativeName:
+ negativeButton: left
+ positiveButton: right
+ altNegativeButton: a
+ altPositiveButton: d
+ gravity: 3
+ dead: 0.001
+ sensitivity: 3
+ snap: 1
+ invert: 0
+ type: 0
+ axis: 0
+ joyNum: 0
+ - serializedVersion: 3
+ m_Name: Vertical
+ descriptiveName:
+ descriptiveNegativeName:
+ negativeButton: down
+ positiveButton: up
+ altNegativeButton: s
+ altPositiveButton: w
+ gravity: 3
+ dead: 0.001
+ sensitivity: 3
+ snap: 1
+ invert: 0
+ type: 0
+ axis: 0
+ joyNum: 0
+ - serializedVersion: 3
+ m_Name: Fire1
+ descriptiveName:
+ descriptiveNegativeName:
+ negativeButton:
+ positiveButton: left ctrl
+ altNegativeButton:
+ altPositiveButton: mouse 0
+ gravity: 1000
+ dead: 0.001
+ sensitivity: 1000
+ snap: 0
+ invert: 0
+ type: 0
+ axis: 0
+ joyNum: 0
+ - serializedVersion: 3
+ m_Name: Fire2
+ descriptiveName:
+ descriptiveNegativeName:
+ negativeButton:
+ positiveButton: left alt
+ altNegativeButton:
+ altPositiveButton: mouse 1
+ gravity: 1000
+ dead: 0.001
+ sensitivity: 1000
+ snap: 0
+ invert: 0
+ type: 0
+ axis: 0
+ joyNum: 0
+ - serializedVersion: 3
+ m_Name: Fire3
+ descriptiveName:
+ descriptiveNegativeName:
+ negativeButton:
+ positiveButton: left shift
+ altNegativeButton:
+ altPositiveButton: mouse 2
+ gravity: 1000
+ dead: 0.001
+ sensitivity: 1000
+ snap: 0
+ invert: 0
+ type: 0
+ axis: 0
+ joyNum: 0
+ - serializedVersion: 3
+ m_Name: Jump
+ descriptiveName:
+ descriptiveNegativeName:
+ negativeButton:
+ positiveButton: space
+ altNegativeButton:
+ altPositiveButton:
+ gravity: 1000
+ dead: 0.001
+ sensitivity: 1000
+ snap: 0
+ invert: 0
+ type: 0
+ axis: 0
+ joyNum: 0
+ - serializedVersion: 3
+ m_Name: Mouse X
+ descriptiveName:
+ descriptiveNegativeName:
+ negativeButton:
+ positiveButton:
+ altNegativeButton:
+ altPositiveButton:
+ gravity: 0
+ dead: 0
+ sensitivity: 0.1
+ snap: 0
+ invert: 0
+ type: 1
+ axis: 0
+ joyNum: 0
+ - serializedVersion: 3
+ m_Name: Mouse Y
+ descriptiveName:
+ descriptiveNegativeName:
+ negativeButton:
+ positiveButton:
+ altNegativeButton:
+ altPositiveButton:
+ gravity: 0
+ dead: 0
+ sensitivity: 0.1
+ snap: 0
+ invert: 0
+ type: 1
+ axis: 1
+ joyNum: 0
+ - serializedVersion: 3
+ m_Name: Mouse ScrollWheel
+ descriptiveName:
+ descriptiveNegativeName:
+ negativeButton:
+ positiveButton:
+ altNegativeButton:
+ altPositiveButton:
+ gravity: 0
+ dead: 0
+ sensitivity: 0.1
+ snap: 0
+ invert: 0
+ type: 1
+ axis: 2
+ joyNum: 0
+ - serializedVersion: 3
+ m_Name: Horizontal
+ descriptiveName:
+ descriptiveNegativeName:
+ negativeButton:
+ positiveButton:
+ altNegativeButton:
+ altPositiveButton:
+ gravity: 0
+ dead: 0.19
+ sensitivity: 1
+ snap: 0
+ invert: 0
+ type: 2
+ axis: 0
+ joyNum: 0
+ - serializedVersion: 3
+ m_Name: Vertical
+ descriptiveName:
+ descriptiveNegativeName:
+ negativeButton:
+ positiveButton:
+ altNegativeButton:
+ altPositiveButton:
+ gravity: 0
+ dead: 0.19
+ sensitivity: 1
+ snap: 0
+ invert: 1
+ type: 2
+ axis: 1
+ joyNum: 0
+ - serializedVersion: 3
+ m_Name: Fire1
+ descriptiveName:
+ descriptiveNegativeName:
+ negativeButton:
+ positiveButton: joystick button 0
+ altNegativeButton:
+ altPositiveButton:
+ gravity: 1000
+ dead: 0.001
+ sensitivity: 1000
+ snap: 0
+ invert: 0
+ type: 0
+ axis: 0
+ joyNum: 0
+ - serializedVersion: 3
+ m_Name: Fire2
+ descriptiveName:
+ descriptiveNegativeName:
+ negativeButton:
+ positiveButton: joystick button 1
+ altNegativeButton:
+ altPositiveButton:
+ gravity: 1000
+ dead: 0.001
+ sensitivity: 1000
+ snap: 0
+ invert: 0
+ type: 0
+ axis: 0
+ joyNum: 0
+ - serializedVersion: 3
+ m_Name: Fire3
+ descriptiveName:
+ descriptiveNegativeName:
+ negativeButton:
+ positiveButton: joystick button 2
+ altNegativeButton:
+ altPositiveButton:
+ gravity: 1000
+ dead: 0.001
+ sensitivity: 1000
+ snap: 0
+ invert: 0
+ type: 0
+ axis: 0
+ joyNum: 0
+ - serializedVersion: 3
+ m_Name: Jump
+ descriptiveName:
+ descriptiveNegativeName:
+ negativeButton:
+ positiveButton: joystick button 3
+ altNegativeButton:
+ altPositiveButton:
+ gravity: 1000
+ dead: 0.001
+ sensitivity: 1000
+ snap: 0
+ invert: 0
+ type: 0
+ axis: 0
+ joyNum: 0
+ - serializedVersion: 3
+ m_Name: Submit
+ descriptiveName:
+ descriptiveNegativeName:
+ negativeButton:
+ positiveButton: return
+ altNegativeButton:
+ altPositiveButton: joystick button 0
+ gravity: 1000
+ dead: 0.001
+ sensitivity: 1000
+ snap: 0
+ invert: 0
+ type: 0
+ axis: 0
+ joyNum: 0
+ - serializedVersion: 3
+ m_Name: Submit
+ descriptiveName:
+ descriptiveNegativeName:
+ negativeButton:
+ positiveButton: enter
+ altNegativeButton:
+ altPositiveButton: space
+ gravity: 1000
+ dead: 0.001
+ sensitivity: 1000
+ snap: 0
+ invert: 0
+ type: 0
+ axis: 0
+ joyNum: 0
+ - serializedVersion: 3
+ m_Name: Cancel
+ descriptiveName:
+ descriptiveNegativeName:
+ negativeButton:
+ positiveButton: escape
+ altNegativeButton:
+ altPositiveButton: joystick button 1
+ gravity: 1000
+ dead: 0.001
+ sensitivity: 1000
+ snap: 0
+ invert: 0
+ type: 0
+ axis: 0
+ joyNum: 0
diff --git a/UnityGame/ProjectSettings/MemorySettings.asset b/UnityGame/ProjectSettings/MemorySettings.asset
new file mode 100644
index 0000000..5b5face
--- /dev/null
+++ b/UnityGame/ProjectSettings/MemorySettings.asset
@@ -0,0 +1,35 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!387306366 &1
+MemorySettings:
+ m_ObjectHideFlags: 0
+ m_EditorMemorySettings:
+ m_MainAllocatorBlockSize: -1
+ m_ThreadAllocatorBlockSize: -1
+ m_MainGfxBlockSize: -1
+ m_ThreadGfxBlockSize: -1
+ m_CacheBlockSize: -1
+ m_TypetreeBlockSize: -1
+ m_ProfilerBlockSize: -1
+ m_ProfilerEditorBlockSize: -1
+ m_BucketAllocatorGranularity: -1
+ m_BucketAllocatorBucketsCount: -1
+ m_BucketAllocatorBlockSize: -1
+ m_BucketAllocatorBlockCount: -1
+ m_ProfilerBucketAllocatorGranularity: -1
+ m_ProfilerBucketAllocatorBucketsCount: -1
+ m_ProfilerBucketAllocatorBlockSize: -1
+ m_ProfilerBucketAllocatorBlockCount: -1
+ m_TempAllocatorSizeMain: -1
+ m_JobTempAllocatorBlockSize: -1
+ m_BackgroundJobTempAllocatorBlockSize: -1
+ m_JobTempAllocatorReducedBlockSize: -1
+ m_TempAllocatorSizeGIBakingWorker: -1
+ m_TempAllocatorSizeNavMeshWorker: -1
+ m_TempAllocatorSizeAudioWorker: -1
+ m_TempAllocatorSizeCloudWorker: -1
+ m_TempAllocatorSizeGfx: -1
+ m_TempAllocatorSizeJobWorker: -1
+ m_TempAllocatorSizeBackgroundWorker: -1
+ m_TempAllocatorSizePreloadManager: -1
+ m_PlatformMemorySettings: {}
diff --git a/UnityGame/ProjectSettings/NavMeshAreas.asset b/UnityGame/ProjectSettings/NavMeshAreas.asset
new file mode 100644
index 0000000..3b0b7c3
--- /dev/null
+++ b/UnityGame/ProjectSettings/NavMeshAreas.asset
@@ -0,0 +1,91 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!126 &1
+NavMeshProjectSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ areas:
+ - name: Walkable
+ cost: 1
+ - name: Not Walkable
+ cost: 1
+ - name: Jump
+ cost: 2
+ - name:
+ cost: 1
+ - name:
+ cost: 1
+ - name:
+ cost: 1
+ - name:
+ cost: 1
+ - name:
+ cost: 1
+ - name:
+ cost: 1
+ - name:
+ cost: 1
+ - name:
+ cost: 1
+ - name:
+ cost: 1
+ - name:
+ cost: 1
+ - name:
+ cost: 1
+ - name:
+ cost: 1
+ - name:
+ cost: 1
+ - name:
+ cost: 1
+ - name:
+ cost: 1
+ - name:
+ cost: 1
+ - name:
+ cost: 1
+ - name:
+ cost: 1
+ - name:
+ cost: 1
+ - name:
+ cost: 1
+ - name:
+ cost: 1
+ - name:
+ cost: 1
+ - name:
+ cost: 1
+ - name:
+ cost: 1
+ - name:
+ cost: 1
+ - name:
+ cost: 1
+ - name:
+ cost: 1
+ - name:
+ cost: 1
+ - name:
+ cost: 1
+ m_LastAgentTypeID: -887442657
+ m_Settings:
+ - serializedVersion: 2
+ agentTypeID: 0
+ agentRadius: 0.5
+ agentHeight: 2
+ agentSlope: 45
+ agentClimb: 0.75
+ ledgeDropHeight: 0
+ maxJumpAcrossDistance: 0
+ minRegionArea: 2
+ manualCellSize: 0
+ cellSize: 0.16666667
+ manualTileSize: 0
+ tileSize: 256
+ accuratePlacement: 0
+ debug:
+ m_Flags: 0
+ m_SettingNames:
+ - Humanoid
diff --git a/UnityGame/ProjectSettings/PackageManagerSettings.asset b/UnityGame/ProjectSettings/PackageManagerSettings.asset
new file mode 100644
index 0000000..112a053
--- /dev/null
+++ b/UnityGame/ProjectSettings/PackageManagerSettings.asset
@@ -0,0 +1,35 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &1
+MonoBehaviour:
+ m_ObjectHideFlags: 61
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 0}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 13964, guid: 0000000000000000e000000000000000, type: 0}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_EnablePreReleasePackages: 0
+ m_EnablePackageDependencies: 0
+ m_AdvancedSettingsExpanded: 1
+ m_ScopedRegistriesSettingsExpanded: 1
+ m_SeeAllPackageVersions: 0
+ oneTimeWarningShown: 0
+ m_Registries:
+ - m_Id: main
+ m_Name:
+ m_Url: https://packages.unity.com
+ m_Scopes: []
+ m_IsDefault: 1
+ m_Capabilities: 7
+ m_UserSelectedRegistryName:
+ m_UserAddingNewScopedRegistry: 0
+ m_RegistryInfoDraft:
+ m_Modified: 0
+ m_ErrorMessage:
+ m_UserModificationsInstanceId: -830
+ m_OriginalInstanceId: -832
+ m_LoadAssets: 0
diff --git a/UnityGame/ProjectSettings/Packages/com.unity.testtools.codecoverage/Settings.json b/UnityGame/ProjectSettings/Packages/com.unity.testtools.codecoverage/Settings.json
new file mode 100644
index 0000000..3c7b4c1
--- /dev/null
+++ b/UnityGame/ProjectSettings/Packages/com.unity.testtools.codecoverage/Settings.json
@@ -0,0 +1,5 @@
+{
+ "m_Dictionary": {
+ "m_DictionaryValues": []
+ }
+}
\ No newline at end of file
diff --git a/UnityGame/ProjectSettings/Physics2DSettings.asset b/UnityGame/ProjectSettings/Physics2DSettings.asset
new file mode 100644
index 0000000..47880b1
--- /dev/null
+++ b/UnityGame/ProjectSettings/Physics2DSettings.asset
@@ -0,0 +1,56 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!19 &1
+Physics2DSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 4
+ m_Gravity: {x: 0, y: -9.81}
+ m_DefaultMaterial: {fileID: 0}
+ m_VelocityIterations: 8
+ m_PositionIterations: 3
+ m_VelocityThreshold: 1
+ m_MaxLinearCorrection: 0.2
+ m_MaxAngularCorrection: 8
+ m_MaxTranslationSpeed: 100
+ m_MaxRotationSpeed: 360
+ m_BaumgarteScale: 0.2
+ m_BaumgarteTimeOfImpactScale: 0.75
+ m_TimeToSleep: 0.5
+ m_LinearSleepTolerance: 0.01
+ m_AngularSleepTolerance: 2
+ m_DefaultContactOffset: 0.01
+ m_JobOptions:
+ serializedVersion: 2
+ useMultithreading: 0
+ useConsistencySorting: 0
+ m_InterpolationPosesPerJob: 100
+ m_NewContactsPerJob: 30
+ m_CollideContactsPerJob: 100
+ m_ClearFlagsPerJob: 200
+ m_ClearBodyForcesPerJob: 200
+ m_SyncDiscreteFixturesPerJob: 50
+ m_SyncContinuousFixturesPerJob: 50
+ m_FindNearestContactsPerJob: 100
+ m_UpdateTriggerContactsPerJob: 100
+ m_IslandSolverCostThreshold: 100
+ m_IslandSolverBodyCostScale: 1
+ m_IslandSolverContactCostScale: 10
+ m_IslandSolverJointCostScale: 10
+ m_IslandSolverBodiesPerJob: 50
+ m_IslandSolverContactsPerJob: 50
+ m_AutoSimulation: 1
+ m_QueriesHitTriggers: 1
+ m_QueriesStartInColliders: 1
+ m_CallbacksOnDisable: 1
+ m_ReuseCollisionCallbacks: 1
+ m_AutoSyncTransforms: 0
+ m_AlwaysShowColliders: 0
+ m_ShowColliderSleep: 1
+ m_ShowColliderContacts: 0
+ m_ShowColliderAABB: 0
+ m_ContactArrowScale: 0.2
+ m_ColliderAwakeColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.7529412}
+ m_ColliderAsleepColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.36078432}
+ m_ColliderContactColor: {r: 1, g: 0, b: 1, a: 0.6862745}
+ m_ColliderAABBColor: {r: 1, g: 1, b: 0, a: 0.2509804}
+ m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
diff --git a/UnityGame/ProjectSettings/PresetManager.asset b/UnityGame/ProjectSettings/PresetManager.asset
new file mode 100644
index 0000000..67a94da
--- /dev/null
+++ b/UnityGame/ProjectSettings/PresetManager.asset
@@ -0,0 +1,7 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1386491679 &1
+PresetManager:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_DefaultPresets: {}
diff --git a/UnityGame/ProjectSettings/ProjectSettings.asset b/UnityGame/ProjectSettings/ProjectSettings.asset
new file mode 100644
index 0000000..fdbb10c
--- /dev/null
+++ b/UnityGame/ProjectSettings/ProjectSettings.asset
@@ -0,0 +1,957 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!129 &1
+PlayerSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 26
+ productGUID: 83aedf63490c60449858198e75a57520
+ AndroidProfiler: 0
+ AndroidFilterTouchesWhenObscured: 0
+ AndroidEnableSustainedPerformanceMode: 0
+ defaultScreenOrientation: 4
+ targetDevice: 2
+ useOnDemandResources: 0
+ accelerometerFrequency: 60
+ companyName: DefaultCompany
+ productName: UnityGame
+ defaultCursor: {fileID: 0}
+ cursorHotspot: {x: 0, y: 0}
+ m_SplashScreenBackgroundColor: {r: 0.13725491, g: 0.12156863, b: 0.1254902, a: 1}
+ m_ShowUnitySplashScreen: 1
+ m_ShowUnitySplashLogo: 1
+ m_SplashScreenOverlayOpacity: 1
+ m_SplashScreenAnimation: 1
+ m_SplashScreenLogoStyle: 1
+ m_SplashScreenDrawMode: 0
+ m_SplashScreenBackgroundAnimationZoom: 1
+ m_SplashScreenLogoAnimationZoom: 1
+ m_SplashScreenBackgroundLandscapeAspect: 1
+ m_SplashScreenBackgroundPortraitAspect: 1
+ m_SplashScreenBackgroundLandscapeUvs:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 1
+ height: 1
+ m_SplashScreenBackgroundPortraitUvs:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 1
+ height: 1
+ m_SplashScreenLogos: []
+ m_VirtualRealitySplashScreen: {fileID: 0}
+ m_HolographicTrackingLossScreen: {fileID: 0}
+ defaultScreenWidth: 1920
+ defaultScreenHeight: 1080
+ defaultScreenWidthWeb: 960
+ defaultScreenHeightWeb: 600
+ m_StereoRenderingPath: 0
+ m_ActiveColorSpace: 1
+ unsupportedMSAAFallback: 0
+ m_SpriteBatchVertexThreshold: 300
+ m_MTRendering: 1
+ mipStripping: 0
+ numberOfMipsStripped: 0
+ numberOfMipsStrippedPerMipmapLimitGroup: {}
+ m_StackTraceTypes: 010000000100000001000000010000000100000001000000
+ iosShowActivityIndicatorOnLoading: -1
+ androidShowActivityIndicatorOnLoading: -1
+ iosUseCustomAppBackgroundBehavior: 0
+ allowedAutorotateToPortrait: 1
+ allowedAutorotateToPortraitUpsideDown: 1
+ allowedAutorotateToLandscapeRight: 1
+ allowedAutorotateToLandscapeLeft: 1
+ useOSAutorotation: 1
+ use32BitDisplayBuffer: 1
+ preserveFramebufferAlpha: 0
+ disableDepthAndStencilBuffers: 0
+ androidStartInFullscreen: 1
+ androidRenderOutsideSafeArea: 1
+ androidUseSwappy: 1
+ androidBlitType: 0
+ androidResizableWindow: 0
+ androidDefaultWindowWidth: 1920
+ androidDefaultWindowHeight: 1080
+ androidMinimumWindowWidth: 400
+ androidMinimumWindowHeight: 300
+ androidFullscreenMode: 1
+ androidAutoRotationBehavior: 1
+ defaultIsNativeResolution: 1
+ macRetinaSupport: 1
+ runInBackground: 1
+ captureSingleScreen: 0
+ muteOtherAudioSources: 0
+ Prepare IOS For Recording: 0
+ Force IOS Speakers When Recording: 0
+ audioSpatialExperience: 0
+ deferSystemGesturesMode: 0
+ hideHomeButton: 0
+ submitAnalytics: 1
+ usePlayerLog: 1
+ dedicatedServerOptimizations: 0
+ bakeCollisionMeshes: 0
+ forceSingleInstance: 0
+ useFlipModelSwapchain: 1
+ resizableWindow: 0
+ useMacAppStoreValidation: 0
+ macAppStoreCategory: public.app-category.games
+ gpuSkinning: 1
+ xboxPIXTextureCapture: 0
+ xboxEnableAvatar: 0
+ xboxEnableKinect: 0
+ xboxEnableKinectAutoTracking: 0
+ xboxEnableFitness: 0
+ visibleInBackground: 1
+ allowFullscreenSwitch: 1
+ fullscreenMode: 1
+ xboxSpeechDB: 0
+ xboxEnableHeadOrientation: 0
+ xboxEnableGuest: 0
+ xboxEnablePIXSampling: 0
+ metalFramebufferOnly: 0
+ xboxOneResolution: 0
+ xboxOneSResolution: 0
+ xboxOneXResolution: 3
+ xboxOneMonoLoggingLevel: 0
+ xboxOneLoggingLevel: 1
+ xboxOneDisableEsram: 0
+ xboxOneEnableTypeOptimization: 0
+ xboxOnePresentImmediateThreshold: 0
+ switchQueueCommandMemory: 0
+ switchQueueControlMemory: 16384
+ switchQueueComputeMemory: 262144
+ switchNVNShaderPoolsGranularity: 33554432
+ switchNVNDefaultPoolsGranularity: 16777216
+ switchNVNOtherPoolsGranularity: 16777216
+ switchGpuScratchPoolGranularity: 2097152
+ switchAllowGpuScratchShrinking: 0
+ switchNVNMaxPublicTextureIDCount: 0
+ switchNVNMaxPublicSamplerIDCount: 0
+ switchNVNGraphicsFirmwareMemory: 32
+ switchMaxWorkerMultiple: 8
+ stadiaPresentMode: 0
+ stadiaTargetFramerate: 0
+ vulkanNumSwapchainBuffers: 3
+ vulkanEnableSetSRGBWrite: 0
+ vulkanEnablePreTransform: 1
+ vulkanEnableLateAcquireNextImage: 0
+ vulkanEnableCommandBufferRecycling: 1
+ loadStoreDebugModeEnabled: 0
+ visionOSBundleVersion: 1.0
+ tvOSBundleVersion: 1.0
+ bundleVersion: 0.1
+ preloadedAssets: []
+ metroInputSource: 0
+ wsaTransparentSwapchain: 0
+ m_HolographicPauseOnTrackingLoss: 1
+ xboxOneDisableKinectGpuReservation: 1
+ xboxOneEnable7thCore: 1
+ vrSettings:
+ enable360StereoCapture: 0
+ isWsaHolographicRemotingEnabled: 0
+ enableFrameTimingStats: 0
+ enableOpenGLProfilerGPURecorders: 1
+ allowHDRDisplaySupport: 0
+ useHDRDisplay: 0
+ hdrBitDepth: 0
+ m_ColorGamuts: 00000000
+ targetPixelDensity: 30
+ resolutionScalingMode: 0
+ resetResolutionOnWindowResize: 0
+ androidSupportedAspectRatio: 1
+ androidMaxAspectRatio: 2.1
+ applicationIdentifier: {}
+ buildNumber:
+ Standalone: 0
+ VisionOS: 0
+ iPhone: 0
+ tvOS: 0
+ overrideDefaultApplicationIdentifier: 0
+ AndroidBundleVersionCode: 1
+ AndroidMinSdkVersion: 22
+ AndroidTargetSdkVersion: 0
+ AndroidPreferredInstallLocation: 1
+ aotOptions:
+ stripEngineCode: 1
+ iPhoneStrippingLevel: 0
+ iPhoneScriptCallOptimization: 0
+ ForceInternetPermission: 0
+ ForceSDCardPermission: 0
+ CreateWallpaper: 0
+ APKExpansionFiles: 0
+ keepLoadedShadersAlive: 0
+ StripUnusedMeshComponents: 1
+ strictShaderVariantMatching: 0
+ VertexChannelCompressionMask: 4054
+ iPhoneSdkVersion: 988
+ iOSTargetOSVersionString: 12.0
+ tvOSSdkVersion: 0
+ tvOSRequireExtendedGameController: 0
+ tvOSTargetOSVersionString: 12.0
+ VisionOSSdkVersion: 0
+ VisionOSTargetOSVersionString: 1.0
+ uIPrerenderedIcon: 0
+ uIRequiresPersistentWiFi: 0
+ uIRequiresFullScreen: 1
+ uIStatusBarHidden: 1
+ uIExitOnSuspend: 0
+ uIStatusBarStyle: 0
+ appleTVSplashScreen: {fileID: 0}
+ appleTVSplashScreen2x: {fileID: 0}
+ tvOSSmallIconLayers: []
+ tvOSSmallIconLayers2x: []
+ tvOSLargeIconLayers: []
+ tvOSLargeIconLayers2x: []
+ tvOSTopShelfImageLayers: []
+ tvOSTopShelfImageLayers2x: []
+ tvOSTopShelfImageWideLayers: []
+ tvOSTopShelfImageWideLayers2x: []
+ iOSLaunchScreenType: 0
+ iOSLaunchScreenPortrait: {fileID: 0}
+ iOSLaunchScreenLandscape: {fileID: 0}
+ iOSLaunchScreenBackgroundColor:
+ serializedVersion: 2
+ rgba: 0
+ iOSLaunchScreenFillPct: 100
+ iOSLaunchScreenSize: 100
+ iOSLaunchScreenCustomXibPath:
+ iOSLaunchScreeniPadType: 0
+ iOSLaunchScreeniPadImage: {fileID: 0}
+ iOSLaunchScreeniPadBackgroundColor:
+ serializedVersion: 2
+ rgba: 0
+ iOSLaunchScreeniPadFillPct: 100
+ iOSLaunchScreeniPadSize: 100
+ iOSLaunchScreeniPadCustomXibPath:
+ iOSLaunchScreenCustomStoryboardPath:
+ iOSLaunchScreeniPadCustomStoryboardPath:
+ iOSDeviceRequirements: []
+ iOSURLSchemes: []
+ macOSURLSchemes: []
+ iOSBackgroundModes: 0
+ iOSMetalForceHardShadows: 0
+ metalEditorSupport: 1
+ metalAPIValidation: 1
+ metalCompileShaderBinary: 0
+ iOSRenderExtraFrameOnPause: 0
+ iosCopyPluginsCodeInsteadOfSymlink: 0
+ appleDeveloperTeamID:
+ iOSManualSigningProvisioningProfileID:
+ tvOSManualSigningProvisioningProfileID:
+ VisionOSManualSigningProvisioningProfileID:
+ iOSManualSigningProvisioningProfileType: 0
+ tvOSManualSigningProvisioningProfileType: 0
+ VisionOSManualSigningProvisioningProfileType: 0
+ appleEnableAutomaticSigning: 0
+ iOSRequireARKit: 0
+ iOSAutomaticallyDetectAndAddCapabilities: 1
+ appleEnableProMotion: 0
+ shaderPrecisionModel: 0
+ clonedFromGUID: c0afd0d1d80e3634a9dac47e8a0426ea
+ templatePackageId: com.unity.template.3d@8.1.3
+ templateDefaultScene: Assets/Scenes/SampleScene.unity
+ useCustomMainManifest: 0
+ useCustomLauncherManifest: 0
+ useCustomMainGradleTemplate: 0
+ useCustomLauncherGradleManifest: 0
+ useCustomBaseGradleTemplate: 0
+ useCustomGradlePropertiesTemplate: 0
+ useCustomGradleSettingsTemplate: 0
+ useCustomProguardFile: 0
+ AndroidTargetArchitectures: 1
+ AndroidTargetDevices: 0
+ AndroidSplashScreenScale: 0
+ androidSplashScreen: {fileID: 0}
+ AndroidKeystoreName:
+ AndroidKeyaliasName:
+ AndroidEnableArmv9SecurityFeatures: 0
+ AndroidBuildApkPerCpuArchitecture: 0
+ AndroidTVCompatibility: 0
+ AndroidIsGame: 1
+ AndroidEnableTango: 0
+ androidEnableBanner: 1
+ androidUseLowAccuracyLocation: 0
+ androidUseCustomKeystore: 0
+ m_AndroidBanners:
+ - width: 320
+ height: 180
+ banner: {fileID: 0}
+ androidGamepadSupportLevel: 0
+ chromeosInputEmulation: 1
+ AndroidMinifyRelease: 0
+ AndroidMinifyDebug: 0
+ AndroidValidateAppBundleSize: 1
+ AndroidAppBundleSizeToValidate: 150
+ m_BuildTargetIcons: []
+ m_BuildTargetPlatformIcons:
+ - m_BuildTarget: iPhone
+ m_Icons:
+ - m_Textures: []
+ m_Width: 180
+ m_Height: 180
+ m_Kind: 0
+ m_SubKind: iPhone
+ - m_Textures: []
+ m_Width: 120
+ m_Height: 120
+ m_Kind: 0
+ m_SubKind: iPhone
+ - m_Textures: []
+ m_Width: 167
+ m_Height: 167
+ m_Kind: 0
+ m_SubKind: iPad
+ - m_Textures: []
+ m_Width: 152
+ m_Height: 152
+ m_Kind: 0
+ m_SubKind: iPad
+ - m_Textures: []
+ m_Width: 76
+ m_Height: 76
+ m_Kind: 0
+ m_SubKind: iPad
+ - m_Textures: []
+ m_Width: 120
+ m_Height: 120
+ m_Kind: 3
+ m_SubKind: iPhone
+ - m_Textures: []
+ m_Width: 80
+ m_Height: 80
+ m_Kind: 3
+ m_SubKind: iPhone
+ - m_Textures: []
+ m_Width: 80
+ m_Height: 80
+ m_Kind: 3
+ m_SubKind: iPad
+ - m_Textures: []
+ m_Width: 40
+ m_Height: 40
+ m_Kind: 3
+ m_SubKind: iPad
+ - m_Textures: []
+ m_Width: 87
+ m_Height: 87
+ m_Kind: 1
+ m_SubKind: iPhone
+ - m_Textures: []
+ m_Width: 58
+ m_Height: 58
+ m_Kind: 1
+ m_SubKind: iPhone
+ - m_Textures: []
+ m_Width: 29
+ m_Height: 29
+ m_Kind: 1
+ m_SubKind: iPhone
+ - m_Textures: []
+ m_Width: 58
+ m_Height: 58
+ m_Kind: 1
+ m_SubKind: iPad
+ - m_Textures: []
+ m_Width: 29
+ m_Height: 29
+ m_Kind: 1
+ m_SubKind: iPad
+ - m_Textures: []
+ m_Width: 60
+ m_Height: 60
+ m_Kind: 2
+ m_SubKind: iPhone
+ - m_Textures: []
+ m_Width: 40
+ m_Height: 40
+ m_Kind: 2
+ m_SubKind: iPhone
+ - m_Textures: []
+ m_Width: 40
+ m_Height: 40
+ m_Kind: 2
+ m_SubKind: iPad
+ - m_Textures: []
+ m_Width: 20
+ m_Height: 20
+ m_Kind: 2
+ m_SubKind: iPad
+ - m_Textures: []
+ m_Width: 1024
+ m_Height: 1024
+ m_Kind: 4
+ m_SubKind: App Store
+ - m_BuildTarget: Android
+ m_Icons:
+ - m_Textures: []
+ m_Width: 432
+ m_Height: 432
+ m_Kind: 2
+ m_SubKind:
+ - m_Textures: []
+ m_Width: 324
+ m_Height: 324
+ m_Kind: 2
+ m_SubKind:
+ - m_Textures: []
+ m_Width: 216
+ m_Height: 216
+ m_Kind: 2
+ m_SubKind:
+ - m_Textures: []
+ m_Width: 162
+ m_Height: 162
+ m_Kind: 2
+ m_SubKind:
+ - m_Textures: []
+ m_Width: 108
+ m_Height: 108
+ m_Kind: 2
+ m_SubKind:
+ - m_Textures: []
+ m_Width: 81
+ m_Height: 81
+ m_Kind: 2
+ m_SubKind:
+ - m_Textures: []
+ m_Width: 192
+ m_Height: 192
+ m_Kind: 1
+ m_SubKind:
+ - m_Textures: []
+ m_Width: 144
+ m_Height: 144
+ m_Kind: 1
+ m_SubKind:
+ - m_Textures: []
+ m_Width: 96
+ m_Height: 96
+ m_Kind: 1
+ m_SubKind:
+ - m_Textures: []
+ m_Width: 72
+ m_Height: 72
+ m_Kind: 1
+ m_SubKind:
+ - m_Textures: []
+ m_Width: 48
+ m_Height: 48
+ m_Kind: 1
+ m_SubKind:
+ - m_Textures: []
+ m_Width: 36
+ m_Height: 36
+ m_Kind: 1
+ m_SubKind:
+ - m_Textures: []
+ m_Width: 192
+ m_Height: 192
+ m_Kind: 0
+ m_SubKind:
+ - m_Textures: []
+ m_Width: 144
+ m_Height: 144
+ m_Kind: 0
+ m_SubKind:
+ - m_Textures: []
+ m_Width: 96
+ m_Height: 96
+ m_Kind: 0
+ m_SubKind:
+ - m_Textures: []
+ m_Width: 72
+ m_Height: 72
+ m_Kind: 0
+ m_SubKind:
+ - m_Textures: []
+ m_Width: 48
+ m_Height: 48
+ m_Kind: 0
+ m_SubKind:
+ - m_Textures: []
+ m_Width: 36
+ m_Height: 36
+ m_Kind: 0
+ m_SubKind:
+ m_BuildTargetBatching:
+ - m_BuildTarget: Standalone
+ m_StaticBatching: 1
+ m_DynamicBatching: 0
+ - m_BuildTarget: tvOS
+ m_StaticBatching: 1
+ m_DynamicBatching: 0
+ - m_BuildTarget: Android
+ m_StaticBatching: 1
+ m_DynamicBatching: 0
+ - m_BuildTarget: iPhone
+ m_StaticBatching: 1
+ m_DynamicBatching: 0
+ - m_BuildTarget: WebGL
+ m_StaticBatching: 0
+ m_DynamicBatching: 0
+ m_BuildTargetShaderSettings: []
+ m_BuildTargetGraphicsJobs:
+ - m_BuildTarget: MacStandaloneSupport
+ m_GraphicsJobs: 0
+ - m_BuildTarget: Switch
+ m_GraphicsJobs: 1
+ - m_BuildTarget: MetroSupport
+ m_GraphicsJobs: 1
+ - m_BuildTarget: AppleTVSupport
+ m_GraphicsJobs: 0
+ - m_BuildTarget: BJMSupport
+ m_GraphicsJobs: 1
+ - m_BuildTarget: LinuxStandaloneSupport
+ m_GraphicsJobs: 1
+ - m_BuildTarget: PS4Player
+ m_GraphicsJobs: 1
+ - m_BuildTarget: iOSSupport
+ m_GraphicsJobs: 0
+ - m_BuildTarget: WindowsStandaloneSupport
+ m_GraphicsJobs: 1
+ - m_BuildTarget: XboxOnePlayer
+ m_GraphicsJobs: 1
+ - m_BuildTarget: LuminSupport
+ m_GraphicsJobs: 0
+ - m_BuildTarget: AndroidPlayer
+ m_GraphicsJobs: 0
+ - m_BuildTarget: WebGLSupport
+ m_GraphicsJobs: 0
+ m_BuildTargetGraphicsJobMode:
+ - m_BuildTarget: PS4Player
+ m_GraphicsJobMode: 0
+ - m_BuildTarget: XboxOnePlayer
+ m_GraphicsJobMode: 0
+ m_BuildTargetGraphicsAPIs:
+ - m_BuildTarget: AndroidPlayer
+ m_APIs: 150000000b000000
+ m_Automatic: 1
+ - m_BuildTarget: iOSSupport
+ m_APIs: 10000000
+ m_Automatic: 1
+ - m_BuildTarget: AppleTVSupport
+ m_APIs: 10000000
+ m_Automatic: 1
+ - m_BuildTarget: WebGLSupport
+ m_APIs: 0b000000
+ m_Automatic: 1
+ m_BuildTargetVRSettings:
+ - m_BuildTarget: Standalone
+ m_Enabled: 0
+ m_Devices:
+ - Oculus
+ - OpenVR
+ m_DefaultShaderChunkSizeInMB: 16
+ m_DefaultShaderChunkCount: 0
+ openGLRequireES31: 0
+ openGLRequireES31AEP: 0
+ openGLRequireES32: 0
+ m_TemplateCustomTags: {}
+ mobileMTRendering:
+ Android: 1
+ iPhone: 1
+ tvOS: 1
+ m_BuildTargetGroupLightmapEncodingQuality:
+ - m_BuildTarget: Android
+ m_EncodingQuality: 1
+ - m_BuildTarget: iPhone
+ m_EncodingQuality: 1
+ - m_BuildTarget: tvOS
+ m_EncodingQuality: 1
+ m_BuildTargetGroupHDRCubemapEncodingQuality:
+ - m_BuildTarget: Android
+ m_EncodingQuality: 1
+ - m_BuildTarget: iPhone
+ m_EncodingQuality: 1
+ - m_BuildTarget: tvOS
+ m_EncodingQuality: 1
+ m_BuildTargetGroupLightmapSettings: []
+ m_BuildTargetGroupLoadStoreDebugModeSettings: []
+ m_BuildTargetNormalMapEncoding:
+ - m_BuildTarget: Android
+ m_Encoding: 1
+ - m_BuildTarget: iPhone
+ m_Encoding: 1
+ - m_BuildTarget: tvOS
+ m_Encoding: 1
+ m_BuildTargetDefaultTextureCompressionFormat:
+ - m_BuildTarget: Android
+ m_Format: 3
+ playModeTestRunnerEnabled: 0
+ runPlayModeTestAsEditModeTest: 0
+ actionOnDotNetUnhandledException: 1
+ enableInternalProfiler: 0
+ logObjCUncaughtExceptions: 1
+ enableCrashReportAPI: 0
+ cameraUsageDescription:
+ locationUsageDescription:
+ microphoneUsageDescription:
+ bluetoothUsageDescription:
+ macOSTargetOSVersion: 10.13.0
+ switchNMETAOverride:
+ switchNetLibKey:
+ switchSocketMemoryPoolSize: 6144
+ switchSocketAllocatorPoolSize: 128
+ switchSocketConcurrencyLimit: 14
+ switchScreenResolutionBehavior: 2
+ switchUseCPUProfiler: 0
+ switchEnableFileSystemTrace: 0
+ switchLTOSetting: 0
+ switchApplicationID: 0x01004b9000490000
+ switchNSODependencies:
+ switchCompilerFlags:
+ switchTitleNames_0:
+ switchTitleNames_1:
+ switchTitleNames_2:
+ switchTitleNames_3:
+ switchTitleNames_4:
+ switchTitleNames_5:
+ switchTitleNames_6:
+ switchTitleNames_7:
+ switchTitleNames_8:
+ switchTitleNames_9:
+ switchTitleNames_10:
+ switchTitleNames_11:
+ switchTitleNames_12:
+ switchTitleNames_13:
+ switchTitleNames_14:
+ switchTitleNames_15:
+ switchPublisherNames_0:
+ switchPublisherNames_1:
+ switchPublisherNames_2:
+ switchPublisherNames_3:
+ switchPublisherNames_4:
+ switchPublisherNames_5:
+ switchPublisherNames_6:
+ switchPublisherNames_7:
+ switchPublisherNames_8:
+ switchPublisherNames_9:
+ switchPublisherNames_10:
+ switchPublisherNames_11:
+ switchPublisherNames_12:
+ switchPublisherNames_13:
+ switchPublisherNames_14:
+ switchPublisherNames_15:
+ switchIcons_0: {fileID: 0}
+ switchIcons_1: {fileID: 0}
+ switchIcons_2: {fileID: 0}
+ switchIcons_3: {fileID: 0}
+ switchIcons_4: {fileID: 0}
+ switchIcons_5: {fileID: 0}
+ switchIcons_6: {fileID: 0}
+ switchIcons_7: {fileID: 0}
+ switchIcons_8: {fileID: 0}
+ switchIcons_9: {fileID: 0}
+ switchIcons_10: {fileID: 0}
+ switchIcons_11: {fileID: 0}
+ switchIcons_12: {fileID: 0}
+ switchIcons_13: {fileID: 0}
+ switchIcons_14: {fileID: 0}
+ switchIcons_15: {fileID: 0}
+ switchSmallIcons_0: {fileID: 0}
+ switchSmallIcons_1: {fileID: 0}
+ switchSmallIcons_2: {fileID: 0}
+ switchSmallIcons_3: {fileID: 0}
+ switchSmallIcons_4: {fileID: 0}
+ switchSmallIcons_5: {fileID: 0}
+ switchSmallIcons_6: {fileID: 0}
+ switchSmallIcons_7: {fileID: 0}
+ switchSmallIcons_8: {fileID: 0}
+ switchSmallIcons_9: {fileID: 0}
+ switchSmallIcons_10: {fileID: 0}
+ switchSmallIcons_11: {fileID: 0}
+ switchSmallIcons_12: {fileID: 0}
+ switchSmallIcons_13: {fileID: 0}
+ switchSmallIcons_14: {fileID: 0}
+ switchSmallIcons_15: {fileID: 0}
+ switchManualHTML:
+ switchAccessibleURLs:
+ switchLegalInformation:
+ switchMainThreadStackSize: 1048576
+ switchPresenceGroupId:
+ switchLogoHandling: 0
+ switchReleaseVersion: 0
+ switchDisplayVersion: 1.0.0
+ switchStartupUserAccount: 0
+ switchSupportedLanguagesMask: 0
+ switchLogoType: 0
+ switchApplicationErrorCodeCategory:
+ switchUserAccountSaveDataSize: 0
+ switchUserAccountSaveDataJournalSize: 0
+ switchApplicationAttribute: 0
+ switchCardSpecSize: -1
+ switchCardSpecClock: -1
+ switchRatingsMask: 0
+ switchRatingsInt_0: 0
+ switchRatingsInt_1: 0
+ switchRatingsInt_2: 0
+ switchRatingsInt_3: 0
+ switchRatingsInt_4: 0
+ switchRatingsInt_5: 0
+ switchRatingsInt_6: 0
+ switchRatingsInt_7: 0
+ switchRatingsInt_8: 0
+ switchRatingsInt_9: 0
+ switchRatingsInt_10: 0
+ switchRatingsInt_11: 0
+ switchRatingsInt_12: 0
+ switchLocalCommunicationIds_0:
+ switchLocalCommunicationIds_1:
+ switchLocalCommunicationIds_2:
+ switchLocalCommunicationIds_3:
+ switchLocalCommunicationIds_4:
+ switchLocalCommunicationIds_5:
+ switchLocalCommunicationIds_6:
+ switchLocalCommunicationIds_7:
+ switchParentalControl: 0
+ switchAllowsScreenshot: 1
+ switchAllowsVideoCapturing: 1
+ switchAllowsRuntimeAddOnContentInstall: 0
+ switchDataLossConfirmation: 0
+ switchUserAccountLockEnabled: 0
+ switchSystemResourceMemory: 16777216
+ switchSupportedNpadStyles: 22
+ switchNativeFsCacheSize: 32
+ switchIsHoldTypeHorizontal: 0
+ switchSupportedNpadCount: 8
+ switchEnableTouchScreen: 1
+ switchSocketConfigEnabled: 0
+ switchTcpInitialSendBufferSize: 32
+ switchTcpInitialReceiveBufferSize: 64
+ switchTcpAutoSendBufferSizeMax: 256
+ switchTcpAutoReceiveBufferSizeMax: 256
+ switchUdpSendBufferSize: 9
+ switchUdpReceiveBufferSize: 42
+ switchSocketBufferEfficiency: 4
+ switchSocketInitializeEnabled: 1
+ switchNetworkInterfaceManagerInitializeEnabled: 1
+ switchUseNewStyleFilepaths: 1
+ switchUseLegacyFmodPriorities: 0
+ switchUseMicroSleepForYield: 1
+ switchEnableRamDiskSupport: 0
+ switchMicroSleepForYieldTime: 25
+ switchRamDiskSpaceSize: 12
+ ps4NPAgeRating: 12
+ ps4NPTitleSecret:
+ ps4NPTrophyPackPath:
+ ps4ParentalLevel: 11
+ ps4ContentID: ED1633-NPXX51362_00-0000000000000000
+ ps4Category: 0
+ ps4MasterVersion: 01.00
+ ps4AppVersion: 01.00
+ ps4AppType: 0
+ ps4ParamSfxPath:
+ ps4VideoOutPixelFormat: 0
+ ps4VideoOutInitialWidth: 1920
+ ps4VideoOutBaseModeInitialWidth: 1920
+ ps4VideoOutReprojectionRate: 60
+ ps4PronunciationXMLPath:
+ ps4PronunciationSIGPath:
+ ps4BackgroundImagePath:
+ ps4StartupImagePath:
+ ps4StartupImagesFolder:
+ ps4IconImagesFolder:
+ ps4SaveDataImagePath:
+ ps4SdkOverride:
+ ps4BGMPath:
+ ps4ShareFilePath:
+ ps4ShareOverlayImagePath:
+ ps4PrivacyGuardImagePath:
+ ps4ExtraSceSysFile:
+ ps4NPtitleDatPath:
+ ps4RemotePlayKeyAssignment: -1
+ ps4RemotePlayKeyMappingDir:
+ ps4PlayTogetherPlayerCount: 0
+ ps4EnterButtonAssignment: 1
+ ps4ApplicationParam1: 0
+ ps4ApplicationParam2: 0
+ ps4ApplicationParam3: 0
+ ps4ApplicationParam4: 0
+ ps4DownloadDataSize: 0
+ ps4GarlicHeapSize: 2048
+ ps4ProGarlicHeapSize: 2560
+ playerPrefsMaxSize: 32768
+ ps4Passcode: frAQBc8Wsa1xVPfvJcrgRYwTiizs2trQ
+ ps4pnSessions: 1
+ ps4pnPresence: 1
+ ps4pnFriends: 1
+ ps4pnGameCustomData: 1
+ playerPrefsSupport: 0
+ enableApplicationExit: 0
+ resetTempFolder: 1
+ restrictedAudioUsageRights: 0
+ ps4UseResolutionFallback: 0
+ ps4ReprojectionSupport: 0
+ ps4UseAudio3dBackend: 0
+ ps4UseLowGarlicFragmentationMode: 1
+ ps4SocialScreenEnabled: 0
+ ps4ScriptOptimizationLevel: 0
+ ps4Audio3dVirtualSpeakerCount: 14
+ ps4attribCpuUsage: 0
+ ps4PatchPkgPath:
+ ps4PatchLatestPkgPath:
+ ps4PatchChangeinfoPath:
+ ps4PatchDayOne: 0
+ ps4attribUserManagement: 0
+ ps4attribMoveSupport: 0
+ ps4attrib3DSupport: 0
+ ps4attribShareSupport: 0
+ ps4attribExclusiveVR: 0
+ ps4disableAutoHideSplash: 0
+ ps4videoRecordingFeaturesUsed: 0
+ ps4contentSearchFeaturesUsed: 0
+ ps4CompatibilityPS5: 0
+ ps4AllowPS5Detection: 0
+ ps4GPU800MHz: 1
+ ps4attribEyeToEyeDistanceSettingVR: 0
+ ps4IncludedModules: []
+ ps4attribVROutputEnabled: 0
+ monoEnv:
+ splashScreenBackgroundSourceLandscape: {fileID: 0}
+ splashScreenBackgroundSourcePortrait: {fileID: 0}
+ blurSplashScreenBackground: 1
+ spritePackerPolicy:
+ webGLMemorySize: 16
+ webGLExceptionSupport: 1
+ webGLNameFilesAsHashes: 0
+ webGLShowDiagnostics: 0
+ webGLDataCaching: 1
+ webGLDebugSymbols: 0
+ webGLEmscriptenArgs:
+ webGLModulesDirectory:
+ webGLTemplate: APPLICATION:Default
+ webGLAnalyzeBuildSize: 0
+ webGLUseEmbeddedResources: 0
+ webGLCompressionFormat: 1
+ webGLWasmArithmeticExceptions: 0
+ webGLLinkerTarget: 1
+ webGLThreadsSupport: 0
+ webGLDecompressionFallback: 0
+ webGLInitialMemorySize: 32
+ webGLMaximumMemorySize: 2048
+ webGLMemoryGrowthMode: 2
+ webGLMemoryLinearGrowthStep: 16
+ webGLMemoryGeometricGrowthStep: 0.2
+ webGLMemoryGeometricGrowthCap: 96
+ webGLPowerPreference: 2
+ scriptingDefineSymbols: {}
+ additionalCompilerArguments: {}
+ platformArchitecture: {}
+ scriptingBackend: {}
+ il2cppCompilerConfiguration: {}
+ il2cppCodeGeneration: {}
+ managedStrippingLevel:
+ EmbeddedLinux: 1
+ GameCoreScarlett: 1
+ GameCoreXboxOne: 1
+ Nintendo Switch: 1
+ PS4: 1
+ PS5: 1
+ QNX: 1
+ Stadia: 1
+ VisionOS: 1
+ WebGL: 1
+ Windows Store Apps: 1
+ XboxOne: 1
+ iPhone: 1
+ tvOS: 1
+ incrementalIl2cppBuild: {}
+ suppressCommonWarnings: 1
+ allowUnsafeCode: 0
+ useDeterministicCompilation: 1
+ additionalIl2CppArgs:
+ scriptingRuntimeVersion: 1
+ gcIncremental: 1
+ gcWBarrierValidation: 0
+ apiCompatibilityLevelPerPlatform: {}
+ m_RenderingPath: 1
+ m_MobileRenderingPath: 1
+ metroPackageName: UnityGame
+ metroPackageVersion:
+ metroCertificatePath:
+ metroCertificatePassword:
+ metroCertificateSubject:
+ metroCertificateIssuer:
+ metroCertificateNotAfter: 0000000000000000
+ metroApplicationDescription: UnityGame
+ wsaImages: {}
+ metroTileShortName:
+ metroTileShowName: 0
+ metroMediumTileShowName: 0
+ metroLargeTileShowName: 0
+ metroWideTileShowName: 0
+ metroSupportStreamingInstall: 0
+ metroLastRequiredScene: 0
+ metroDefaultTileSize: 1
+ metroTileForegroundText: 2
+ metroTileBackgroundColor: {r: 0.13333334, g: 0.17254902, b: 0.21568628, a: 0}
+ metroSplashScreenBackgroundColor: {r: 0.12941177, g: 0.17254902, b: 0.21568628, a: 1}
+ metroSplashScreenUseBackgroundColor: 0
+ syncCapabilities: 0
+ platformCapabilities: {}
+ metroTargetDeviceFamilies: {}
+ metroFTAName:
+ metroFTAFileTypes: []
+ metroProtocolName:
+ vcxProjDefaultLanguage:
+ XboxOneProductId:
+ XboxOneUpdateKey:
+ XboxOneSandboxId:
+ XboxOneContentId:
+ XboxOneTitleId:
+ XboxOneSCId:
+ XboxOneGameOsOverridePath:
+ XboxOnePackagingOverridePath:
+ XboxOneAppManifestOverridePath:
+ XboxOneVersion: 1.0.0.0
+ XboxOnePackageEncryption: 0
+ XboxOnePackageUpdateGranularity: 2
+ XboxOneDescription:
+ XboxOneLanguage:
+ - enus
+ XboxOneCapability: []
+ XboxOneGameRating: {}
+ XboxOneIsContentPackage: 0
+ XboxOneEnhancedXboxCompatibilityMode: 0
+ XboxOneEnableGPUVariability: 1
+ XboxOneSockets: {}
+ XboxOneSplashScreen: {fileID: 0}
+ XboxOneAllowedProductIds: []
+ XboxOnePersistentLocalStorageSize: 0
+ XboxOneXTitleMemory: 8
+ XboxOneOverrideIdentityName:
+ XboxOneOverrideIdentityPublisher:
+ vrEditorSettings: {}
+ cloudServicesEnabled:
+ UNet: 1
+ luminIcon:
+ m_Name:
+ m_ModelFolderPath:
+ m_PortalFolderPath:
+ luminCert:
+ m_CertPath:
+ m_SignPackage: 1
+ luminIsChannelApp: 0
+ luminVersion:
+ m_VersionCode: 1
+ m_VersionName:
+ hmiPlayerDataPath:
+ hmiForceSRGBBlit: 1
+ embeddedLinuxEnableGamepadInput: 1
+ hmiLogStartupTiming: 0
+ hmiCpuConfiguration:
+ apiCompatibilityLevel: 6
+ activeInputHandler: 0
+ windowsGamepadBackendHint: 0
+ cloudProjectId: 3e40f18c-f76a-4894-829c-08f9e7b12950
+ framebufferDepthMemorylessMode: 0
+ qualitySettingsNames: []
+ projectName: UnityGame
+ organizationId: wechat_os_qy03l6koqq8z9dvyrsgqxii5s
+ cloudEnabled: 0
+ legacyClampBlendShapeWeights: 0
+ hmiLoadingImage: {fileID: 0}
+ platformRequiresReadableAssets: 0
+ virtualTexturingSupportEnabled: 0
+ insecureHttpOption: 0
diff --git a/UnityGame/ProjectSettings/ProjectVersion.txt b/UnityGame/ProjectSettings/ProjectVersion.txt
new file mode 100644
index 0000000..8fb87e6
--- /dev/null
+++ b/UnityGame/ProjectSettings/ProjectVersion.txt
@@ -0,0 +1,2 @@
+m_EditorVersion: 2022.3.50f1
+m_EditorVersionWithRevision: 2022.3.50f1 (c3db7f8bf9b1)
diff --git a/UnityGame/ProjectSettings/QualitySettings.asset b/UnityGame/ProjectSettings/QualitySettings.asset
new file mode 100644
index 0000000..36c0dad
--- /dev/null
+++ b/UnityGame/ProjectSettings/QualitySettings.asset
@@ -0,0 +1,234 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!47 &1
+QualitySettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 5
+ m_CurrentQuality: 5
+ m_QualitySettings:
+ - serializedVersion: 2
+ name: Very Low
+ pixelLightCount: 0
+ shadows: 0
+ shadowResolution: 0
+ shadowProjection: 1
+ shadowCascades: 1
+ shadowDistance: 15
+ shadowNearPlaneOffset: 3
+ shadowCascade2Split: 0.33333334
+ shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
+ shadowmaskMode: 0
+ blendWeights: 1
+ textureQuality: 1
+ anisotropicTextures: 0
+ antiAliasing: 0
+ softParticles: 0
+ softVegetation: 0
+ realtimeReflectionProbes: 0
+ billboardsFaceCameraPosition: 0
+ vSyncCount: 0
+ lodBias: 0.3
+ maximumLODLevel: 0
+ streamingMipmapsActive: 0
+ streamingMipmapsAddAllCameras: 1
+ streamingMipmapsMemoryBudget: 512
+ streamingMipmapsRenderersPerFrame: 512
+ streamingMipmapsMaxLevelReduction: 2
+ streamingMipmapsMaxFileIORequests: 1024
+ particleRaycastBudget: 4
+ asyncUploadTimeSlice: 2
+ asyncUploadBufferSize: 16
+ asyncUploadPersistentBuffer: 1
+ resolutionScalingFixedDPIFactor: 1
+ excludedTargetPlatforms: []
+ - serializedVersion: 2
+ name: Low
+ pixelLightCount: 0
+ shadows: 0
+ shadowResolution: 0
+ shadowProjection: 1
+ shadowCascades: 1
+ shadowDistance: 20
+ shadowNearPlaneOffset: 3
+ shadowCascade2Split: 0.33333334
+ shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
+ shadowmaskMode: 0
+ blendWeights: 2
+ textureQuality: 0
+ anisotropicTextures: 0
+ antiAliasing: 0
+ softParticles: 0
+ softVegetation: 0
+ realtimeReflectionProbes: 0
+ billboardsFaceCameraPosition: 0
+ vSyncCount: 0
+ lodBias: 0.4
+ maximumLODLevel: 0
+ streamingMipmapsActive: 0
+ streamingMipmapsAddAllCameras: 1
+ streamingMipmapsMemoryBudget: 512
+ streamingMipmapsRenderersPerFrame: 512
+ streamingMipmapsMaxLevelReduction: 2
+ streamingMipmapsMaxFileIORequests: 1024
+ particleRaycastBudget: 16
+ asyncUploadTimeSlice: 2
+ asyncUploadBufferSize: 16
+ asyncUploadPersistentBuffer: 1
+ resolutionScalingFixedDPIFactor: 1
+ excludedTargetPlatforms: []
+ - serializedVersion: 2
+ name: Medium
+ pixelLightCount: 1
+ shadows: 1
+ shadowResolution: 0
+ shadowProjection: 1
+ shadowCascades: 1
+ shadowDistance: 20
+ shadowNearPlaneOffset: 3
+ shadowCascade2Split: 0.33333334
+ shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
+ shadowmaskMode: 0
+ blendWeights: 2
+ textureQuality: 0
+ anisotropicTextures: 1
+ antiAliasing: 0
+ softParticles: 0
+ softVegetation: 0
+ realtimeReflectionProbes: 0
+ billboardsFaceCameraPosition: 0
+ vSyncCount: 1
+ lodBias: 0.7
+ maximumLODLevel: 0
+ streamingMipmapsActive: 0
+ streamingMipmapsAddAllCameras: 1
+ streamingMipmapsMemoryBudget: 512
+ streamingMipmapsRenderersPerFrame: 512
+ streamingMipmapsMaxLevelReduction: 2
+ streamingMipmapsMaxFileIORequests: 1024
+ particleRaycastBudget: 64
+ asyncUploadTimeSlice: 2
+ asyncUploadBufferSize: 16
+ asyncUploadPersistentBuffer: 1
+ resolutionScalingFixedDPIFactor: 1
+ excludedTargetPlatforms: []
+ - serializedVersion: 2
+ name: High
+ pixelLightCount: 2
+ shadows: 2
+ shadowResolution: 1
+ shadowProjection: 1
+ shadowCascades: 2
+ shadowDistance: 40
+ shadowNearPlaneOffset: 3
+ shadowCascade2Split: 0.33333334
+ shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
+ shadowmaskMode: 1
+ blendWeights: 2
+ textureQuality: 0
+ anisotropicTextures: 1
+ antiAliasing: 0
+ softParticles: 0
+ softVegetation: 1
+ realtimeReflectionProbes: 1
+ billboardsFaceCameraPosition: 1
+ vSyncCount: 1
+ lodBias: 1
+ maximumLODLevel: 0
+ streamingMipmapsActive: 0
+ streamingMipmapsAddAllCameras: 1
+ streamingMipmapsMemoryBudget: 512
+ streamingMipmapsRenderersPerFrame: 512
+ streamingMipmapsMaxLevelReduction: 2
+ streamingMipmapsMaxFileIORequests: 1024
+ particleRaycastBudget: 256
+ asyncUploadTimeSlice: 2
+ asyncUploadBufferSize: 16
+ asyncUploadPersistentBuffer: 1
+ resolutionScalingFixedDPIFactor: 1
+ excludedTargetPlatforms: []
+ - serializedVersion: 2
+ name: Very High
+ pixelLightCount: 3
+ shadows: 2
+ shadowResolution: 2
+ shadowProjection: 1
+ shadowCascades: 2
+ shadowDistance: 70
+ shadowNearPlaneOffset: 3
+ shadowCascade2Split: 0.33333334
+ shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
+ shadowmaskMode: 1
+ blendWeights: 4
+ textureQuality: 0
+ anisotropicTextures: 2
+ antiAliasing: 2
+ softParticles: 1
+ softVegetation: 1
+ realtimeReflectionProbes: 1
+ billboardsFaceCameraPosition: 1
+ vSyncCount: 1
+ lodBias: 1.5
+ maximumLODLevel: 0
+ streamingMipmapsActive: 0
+ streamingMipmapsAddAllCameras: 1
+ streamingMipmapsMemoryBudget: 512
+ streamingMipmapsRenderersPerFrame: 512
+ streamingMipmapsMaxLevelReduction: 2
+ streamingMipmapsMaxFileIORequests: 1024
+ particleRaycastBudget: 1024
+ asyncUploadTimeSlice: 2
+ asyncUploadBufferSize: 16
+ asyncUploadPersistentBuffer: 1
+ resolutionScalingFixedDPIFactor: 1
+ excludedTargetPlatforms: []
+ - serializedVersion: 2
+ name: Ultra
+ pixelLightCount: 4
+ shadows: 2
+ shadowResolution: 2
+ shadowProjection: 1
+ shadowCascades: 4
+ shadowDistance: 150
+ shadowNearPlaneOffset: 3
+ shadowCascade2Split: 0.33333334
+ shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
+ shadowmaskMode: 1
+ blendWeights: 4
+ textureQuality: 0
+ anisotropicTextures: 2
+ antiAliasing: 2
+ softParticles: 1
+ softVegetation: 1
+ realtimeReflectionProbes: 1
+ billboardsFaceCameraPosition: 1
+ vSyncCount: 1
+ lodBias: 2
+ maximumLODLevel: 0
+ streamingMipmapsActive: 0
+ streamingMipmapsAddAllCameras: 1
+ streamingMipmapsMemoryBudget: 512
+ streamingMipmapsRenderersPerFrame: 512
+ streamingMipmapsMaxLevelReduction: 2
+ streamingMipmapsMaxFileIORequests: 1024
+ particleRaycastBudget: 4096
+ asyncUploadTimeSlice: 2
+ asyncUploadBufferSize: 16
+ asyncUploadPersistentBuffer: 1
+ resolutionScalingFixedDPIFactor: 1
+ excludedTargetPlatforms: []
+ m_PerPlatformDefaultQuality:
+ Android: 2
+ Lumin: 5
+ GameCoreScarlett: 5
+ GameCoreXboxOne: 5
+ Nintendo 3DS: 5
+ Nintendo Switch: 5
+ PS4: 5
+ PS5: 5
+ Stadia: 5
+ Standalone: 5
+ WebGL: 3
+ Windows Store Apps: 5
+ XboxOne: 5
+ iPhone: 2
+ tvOS: 2
diff --git a/UnityGame/ProjectSettings/SceneTemplateSettings.json b/UnityGame/ProjectSettings/SceneTemplateSettings.json
new file mode 100644
index 0000000..5e97f83
--- /dev/null
+++ b/UnityGame/ProjectSettings/SceneTemplateSettings.json
@@ -0,0 +1,121 @@
+{
+ "templatePinStates": [],
+ "dependencyTypeInfos": [
+ {
+ "userAdded": false,
+ "type": "UnityEngine.AnimationClip",
+ "defaultInstantiationMode": 0
+ },
+ {
+ "userAdded": false,
+ "type": "UnityEditor.Animations.AnimatorController",
+ "defaultInstantiationMode": 0
+ },
+ {
+ "userAdded": false,
+ "type": "UnityEngine.AnimatorOverrideController",
+ "defaultInstantiationMode": 0
+ },
+ {
+ "userAdded": false,
+ "type": "UnityEditor.Audio.AudioMixerController",
+ "defaultInstantiationMode": 0
+ },
+ {
+ "userAdded": false,
+ "type": "UnityEngine.ComputeShader",
+ "defaultInstantiationMode": 1
+ },
+ {
+ "userAdded": false,
+ "type": "UnityEngine.Cubemap",
+ "defaultInstantiationMode": 0
+ },
+ {
+ "userAdded": false,
+ "type": "UnityEngine.GameObject",
+ "defaultInstantiationMode": 0
+ },
+ {
+ "userAdded": false,
+ "type": "UnityEditor.LightingDataAsset",
+ "defaultInstantiationMode": 0
+ },
+ {
+ "userAdded": false,
+ "type": "UnityEngine.LightingSettings",
+ "defaultInstantiationMode": 0
+ },
+ {
+ "userAdded": false,
+ "type": "UnityEngine.Material",
+ "defaultInstantiationMode": 0
+ },
+ {
+ "userAdded": false,
+ "type": "UnityEditor.MonoScript",
+ "defaultInstantiationMode": 1
+ },
+ {
+ "userAdded": false,
+ "type": "UnityEngine.PhysicMaterial",
+ "defaultInstantiationMode": 0
+ },
+ {
+ "userAdded": false,
+ "type": "UnityEngine.PhysicsMaterial2D",
+ "defaultInstantiationMode": 0
+ },
+ {
+ "userAdded": false,
+ "type": "UnityEngine.Rendering.PostProcessing.PostProcessProfile",
+ "defaultInstantiationMode": 0
+ },
+ {
+ "userAdded": false,
+ "type": "UnityEngine.Rendering.PostProcessing.PostProcessResources",
+ "defaultInstantiationMode": 0
+ },
+ {
+ "userAdded": false,
+ "type": "UnityEngine.Rendering.VolumeProfile",
+ "defaultInstantiationMode": 0
+ },
+ {
+ "userAdded": false,
+ "type": "UnityEditor.SceneAsset",
+ "defaultInstantiationMode": 1
+ },
+ {
+ "userAdded": false,
+ "type": "UnityEngine.Shader",
+ "defaultInstantiationMode": 1
+ },
+ {
+ "userAdded": false,
+ "type": "UnityEngine.ShaderVariantCollection",
+ "defaultInstantiationMode": 1
+ },
+ {
+ "userAdded": false,
+ "type": "UnityEngine.Texture",
+ "defaultInstantiationMode": 0
+ },
+ {
+ "userAdded": false,
+ "type": "UnityEngine.Texture2D",
+ "defaultInstantiationMode": 0
+ },
+ {
+ "userAdded": false,
+ "type": "UnityEngine.Timeline.TimelineAsset",
+ "defaultInstantiationMode": 0
+ }
+ ],
+ "defaultDependencyTypeInfo": {
+ "userAdded": false,
+ "type": "",
+ "defaultInstantiationMode": 1
+ },
+ "newSceneOverride": 0
+}
\ No newline at end of file
diff --git a/UnityGame/ProjectSettings/TagManager.asset b/UnityGame/ProjectSettings/TagManager.asset
new file mode 100644
index 0000000..1c92a78
--- /dev/null
+++ b/UnityGame/ProjectSettings/TagManager.asset
@@ -0,0 +1,43 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!78 &1
+TagManager:
+ serializedVersion: 2
+ tags: []
+ layers:
+ - Default
+ - TransparentFX
+ - Ignore Raycast
+ -
+ - Water
+ - UI
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ m_SortingLayers:
+ - name: Default
+ uniqueID: 0
+ locked: 0
diff --git a/UnityGame/ProjectSettings/TimeManager.asset b/UnityGame/ProjectSettings/TimeManager.asset
new file mode 100644
index 0000000..558a017
--- /dev/null
+++ b/UnityGame/ProjectSettings/TimeManager.asset
@@ -0,0 +1,9 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!5 &1
+TimeManager:
+ m_ObjectHideFlags: 0
+ Fixed Timestep: 0.02
+ Maximum Allowed Timestep: 0.33333334
+ m_TimeScale: 1
+ Maximum Particle Timestep: 0.03
diff --git a/UnityGame/ProjectSettings/UnityConnectSettings.asset b/UnityGame/ProjectSettings/UnityConnectSettings.asset
new file mode 100644
index 0000000..a88bee0
--- /dev/null
+++ b/UnityGame/ProjectSettings/UnityConnectSettings.asset
@@ -0,0 +1,36 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!310 &1
+UnityConnectSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 1
+ m_Enabled: 0
+ m_TestMode: 0
+ m_EventOldUrl: https://api.uca.cloud.unity3d.com/v1/events
+ m_EventUrl: https://cdp.cloud.unity3d.com/v1/events
+ m_ConfigUrl: https://config.uca.cloud.unity3d.com
+ m_DashboardUrl: https://dashboard.unity3d.com
+ m_TestInitMode: 0
+ CrashReportingSettings:
+ m_EventUrl: https://perf-events.cloud.unity3d.com
+ m_Enabled: 0
+ m_LogBufferSize: 10
+ m_CaptureEditorExceptions: 1
+ UnityPurchasingSettings:
+ m_Enabled: 0
+ m_TestMode: 0
+ UnityAnalyticsSettings:
+ m_Enabled: 0
+ m_TestMode: 0
+ m_InitializeOnStartup: 1
+ m_PackageRequiringCoreStatsPresent: 0
+ UnityAdsSettings:
+ m_Enabled: 0
+ m_InitializeOnStartup: 1
+ m_TestMode: 0
+ m_IosGameId:
+ m_AndroidGameId:
+ m_GameIds: {}
+ m_GameId:
+ PerformanceReportingSettings:
+ m_Enabled: 0
diff --git a/UnityGame/ProjectSettings/VFXManager.asset b/UnityGame/ProjectSettings/VFXManager.asset
new file mode 100644
index 0000000..3a95c98
--- /dev/null
+++ b/UnityGame/ProjectSettings/VFXManager.asset
@@ -0,0 +1,12 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!937362698 &1
+VFXManager:
+ m_ObjectHideFlags: 0
+ m_IndirectShader: {fileID: 0}
+ m_CopyBufferShader: {fileID: 0}
+ m_SortShader: {fileID: 0}
+ m_StripUpdateShader: {fileID: 0}
+ m_RenderPipeSettingsPath:
+ m_FixedTimeStep: 0.016666668
+ m_MaxDeltaTime: 0.05
diff --git a/UnityGame/ProjectSettings/VersionControlSettings.asset b/UnityGame/ProjectSettings/VersionControlSettings.asset
new file mode 100644
index 0000000..dca2881
--- /dev/null
+++ b/UnityGame/ProjectSettings/VersionControlSettings.asset
@@ -0,0 +1,8 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!890905787 &1
+VersionControlSettings:
+ m_ObjectHideFlags: 0
+ m_Mode: Visible Meta Files
+ m_CollabEditorSettings:
+ inProgressEnabled: 1
diff --git a/UnityGame/ProjectSettings/XRSettings.asset b/UnityGame/ProjectSettings/XRSettings.asset
new file mode 100644
index 0000000..482590c
--- /dev/null
+++ b/UnityGame/ProjectSettings/XRSettings.asset
@@ -0,0 +1,10 @@
+{
+ "m_SettingKeys": [
+ "VR Device Disabled",
+ "VR Device User Alert"
+ ],
+ "m_SettingValues": [
+ "False",
+ "False"
+ ]
+}
\ No newline at end of file
diff --git a/UnityGame/UserSettings/EditorUserSettings.asset b/UnityGame/UserSettings/EditorUserSettings.asset
new file mode 100644
index 0000000..c0c6ce0
--- /dev/null
+++ b/UnityGame/UserSettings/EditorUserSettings.asset
@@ -0,0 +1,29 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!162 &1
+EditorUserSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 4
+ m_ConfigSettings:
+ RecentlyUsedSceneGuid-0:
+ value: 5a5757560101590a5d0c0e24427b5d44434e4c7a7b7a23677f2b4565b7b5353a
+ flags: 0
+ vcSharedLogLevel:
+ value: 0d5e400f0650
+ flags: 0
+ m_VCAutomaticAdd: 1
+ m_VCDebugCom: 0
+ m_VCDebugCmd: 0
+ m_VCDebugOut: 0
+ m_SemanticMergeMode: 2
+ m_DesiredImportWorkerCount: 5
+ m_StandbyImportWorkerCount: 2
+ m_IdleImportWorkerShutdownDelay: 60000
+ m_VCShowFailedCheckout: 1
+ m_VCOverwriteFailedCheckoutAssets: 1
+ m_VCProjectOverlayIcons: 1
+ m_VCHierarchyOverlayIcons: 1
+ m_VCOtherOverlayIcons: 1
+ m_VCAllowAsyncUpdate: 1
+ m_VCScanLocalPackagesOnConnect: 1
+ m_ArtifactGarbageCollection: 1
diff --git a/UnityGame/UserSettings/Search.settings b/UnityGame/UserSettings/Search.settings
new file mode 100644
index 0000000..9e26dfe
--- /dev/null
+++ b/UnityGame/UserSettings/Search.settings
@@ -0,0 +1 @@
+{}
\ No newline at end of file