feat: add config instance.

This commit is contained in:
Tungdv
2026-03-09 19:28:45 +07:00
parent e9a909fa35
commit 51667e8867
12 changed files with 2528 additions and 13 deletions
+967
View File
@@ -0,0 +1,967 @@
[
{
"m_strName": "Đại lục Hoàn Mỹ",
"m_id": 1,
"m_strPath": "world",
"m_iRowNum": 11,
"m_iColNum": 8,
"m_bLimitJump": 0,
"m_routeFiles": [
"r1_5-c4_5-l0",
"r3_3-c6_6-l0",
"r4_7-c2_3-l0",
"r8_8-c1_3-l0",
"r8_9-c6_6-l0",
"r1_2-c7_7-l0"
],
"m_content": "{}"
},
{
"m_strName": "Minh Thú Thành",
"m_id": 101,
"m_strPath": "a01",
"m_iRowNum": 1,
"m_iColNum": 1,
"m_bLimitJump": 1,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Anh Hùng Trủng",
"m_id": 102,
"m_strPath": "a02",
"m_iRowNum": 1,
"m_iColNum": 1,
"m_bLimitJump": 1,
"m_routeFiles": [
"r0_0-c0_0-l0"
],
"m_content": "{}"
},
{
"m_strName": "Bàn Ti Động",
"m_id": 103,
"m_strPath": "a03",
"m_iRowNum": 1,
"m_iColNum": 1,
"m_bLimitJump": 1,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Thổ Nâu Động Huyệt",
"m_id": 104,
"m_strPath": "a04",
"m_iRowNum": 1,
"m_iColNum": 1,
"m_bLimitJump": 1,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Hỏa Nham Động Huyệt",
"m_id": 105,
"m_strPath": "a05",
"m_iRowNum": 1,
"m_iColNum": 1,
"m_bLimitJump": 1,
"m_routeFiles": [
"r0_0-c0_0-l0"
],
"m_content": "{}"
},
{
"m_strName": "Cuồng Lang Sào Huyệt",
"m_id": 106,
"m_strPath": "a06",
"m_iRowNum": 1,
"m_iColNum": 1,
"m_bLimitJump": 1,
"m_routeFiles": [
"r0_0-c0_0-l0"
],
"m_content": "{}"
},
{
"m_strName": "Xà Hạt Động",
"m_id": 107,
"m_strPath": "a07",
"m_iRowNum": 1,
"m_iColNum": 1,
"m_bLimitJump": 1,
"m_routeFiles": [
"r0_0-c0_0-l0"
],
"m_content": "{}"
},
{
"m_strName": "Thanh Y Trủng",
"m_id": 108,
"m_strPath": "a08",
"m_iRowNum": 1,
"m_iColNum": 1,
"m_bLimitJump": 1,
"m_routeFiles": [
"r0_0-c0_0-l0"
],
"m_content": "{}"
},
{
"m_strName": "U Minh Cư",
"m_id": 109,
"m_strPath": "a09",
"m_iRowNum": 1,
"m_iColNum": 1,
"m_bLimitJump": 1,
"m_routeFiles": [
"r0_0-c0_0-l0"
],
"m_content": "{}"
},
{
"m_strName": "Lí Sương Bí Cảnh",
"m_id": 110,
"m_strPath": "a10",
"m_iRowNum": 1,
"m_iColNum": 1,
"m_bLimitJump": 1,
"m_routeFiles": [
"r0_0-c0_0-l0"
],
"m_content": "{}"
},
{
"m_strName": "Thiên Kiếp Cốc",
"m_id": 111,
"m_strPath": "a11",
"m_iRowNum": 1,
"m_iColNum": 1,
"m_bLimitJump": 1,
"m_routeFiles": [
"r0_0-c0_0-l0"
],
"m_content": "{}"
},
{
"m_strName": "Tùng Lâm Di Tích",
"m_id": 112,
"m_strPath": "a12",
"m_iRowNum": 1,
"m_iColNum": 1,
"m_bLimitJump": 1,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Quỷ Vực Huyễn Cảnh",
"m_id": 113,
"m_strPath": "a13",
"m_iRowNum": 1,
"m_iColNum": 1,
"m_bLimitJump": 1,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Oán Linh Chi Môn",
"m_id": 114,
"m_strPath": "a14",
"m_iRowNum": 1,
"m_iColNum": 1,
"m_bLimitJump": 1,
"m_routeFiles": [
"r0_0-c0_0-l0"
],
"m_content": "{}"
},
{
"m_strName": "Bí Bảo Quật",
"m_id": 115,
"m_strPath": "a15",
"m_iRowNum": 1,
"m_iColNum": 1,
"m_bLimitJump": 1,
"m_routeFiles": [
"r0_0-c0_0-l0"
],
"m_content": "{}"
},
{
"m_strName": "Tiên Huyễn Thiên",
"m_id": 116,
"m_strPath": "a16",
"m_iRowNum": 1,
"m_iColNum": 1,
"m_bLimitJump": 1,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Ma Huyễn Thiên",
"m_id": 117,
"m_strPath": "a17",
"m_iRowNum": 1,
"m_iColNum": 1,
"m_bLimitJump": 1,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Long Cung",
"m_id": 118,
"m_strPath": "a18",
"m_iRowNum": 3,
"m_iColNum": 3,
"m_bLimitJump": 1,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Dạ Khốc Đảo",
"m_id": 119,
"m_strPath": "a19",
"m_iRowNum": 3,
"m_iColNum": 3,
"m_bLimitJump": 1,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Vạn Xà Đảo",
"m_id": 120,
"m_strPath": "a20",
"m_iRowNum": 3,
"m_iColNum": 3,
"m_bLimitJump": 0,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Tiên Giới",
"m_id": 121,
"m_strPath": "a21",
"m_iRowNum": 4,
"m_iColNum": 4,
"m_bLimitJump": 0,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Ma Giới",
"m_id": 122,
"m_strPath": "a22",
"m_iRowNum": 4,
"m_iColNum": 4,
"m_bLimitJump": 0,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Thiên Giới Luyện Ngục",
"m_id": 123,
"m_strPath": "a23",
"m_iRowNum": 3,
"m_iColNum": 3,
"m_bLimitJump": 1,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Ma Vực Đào Nguyên",
"m_id": 124,
"m_strPath": "a24",
"m_iRowNum": 1,
"m_iColNum": 1,
"m_bLimitJump": 1,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Chiến Ca Chi Thành",
"m_id": 125,
"m_strPath": "a25",
"m_iRowNum": 3,
"m_iColNum": 3,
"m_bLimitJump": 1,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Luân Hồi Điện",
"m_id": 126,
"m_strPath": "a26",
"m_iRowNum": 1,
"m_iColNum": 1,
"m_bLimitJump": 1,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Thần Nguyệt Cốc",
"m_id": 127,
"m_strPath": "a27",
"m_iRowNum": 1,
"m_iColNum": 1,
"m_bLimitJump": 1,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Thần Vô Cốc",
"m_id": 128,
"m_strPath": "a28",
"m_iRowNum": 1,
"m_iColNum": 1,
"m_bLimitJump": 1,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Phúc Sương Thành",
"m_id": 129,
"m_strPath": "a29",
"m_iRowNum": 1,
"m_iColNum": 1,
"m_bLimitJump": 1,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Hoàng Hôn Thánh Điện",
"m_id": 131,
"m_strPath": "a31",
"m_iRowNum": 1,
"m_iColNum": 1,
"m_bLimitJump": 1,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Vận Mệnh Ma Phương",
"m_id": 132,
"m_strPath": "a32",
"m_iRowNum": 3,
"m_iColNum": 3,
"m_bLimitJump": 1,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Thiên Lệ Chi Thành",
"m_id": 133,
"m_strPath": "a33",
"m_iRowNum": 2,
"m_iColNum": 2,
"m_bLimitJump": 0,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Khung cảnh Hôn Lễ",
"m_id": 134,
"m_strPath": "a34",
"m_iRowNum": 2,
"m_iColNum": 2,
"m_bLimitJump": 0,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Phụ bản Bang Phái",
"m_id": 135,
"m_strPath": "a35",
"m_iRowNum": 4,
"m_iColNum": 1,
"m_bLimitJump": 0,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Bồng Lai Huyễn Cảnh",
"m_id": 137,
"m_strPath": "a37",
"m_iRowNum": 3,
"m_iColNum": 6,
"m_bLimitJump": 0,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Phượng Minh Cốc",
"m_id": 138,
"m_strPath": "a38",
"m_iRowNum": 2,
"m_iColNum": 2,
"m_bLimitJump": 1,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Vô ĐỊnh Trụ-mô thức cấp thấp",
"m_id": 139,
"m_strPath": "a39",
"m_iRowNum": 1,
"m_iColNum": 1,
"m_bLimitJump": 1,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Phục Nhĩ Địa Huyệt Thần Độc Chi Gian",
"m_id": 140,
"m_strPath": "a40",
"m_iRowNum": 2,
"m_iColNum": 2,
"m_bLimitJump": 0,
"m_routeFiles": [
],
"m_content": "{ 0, -200, 160, 200, a40_tile_0101.dds }"
},
{
"m_strName": "Vô ĐỊnh Trụ-mô thức cấp cao",
"m_id": 141,
"m_strPath": "a41",
"m_iRowNum": 1,
"m_iColNum": 1,
"m_bLimitJump": 1,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Chiến Thần Cốc",
"m_id": 142,
"m_strPath": "a42",
"m_iRowNum": 2,
"m_iColNum": 2,
"m_bLimitJump": 1,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Ngũ Đế Chi Đô",
"m_id": 143,
"m_strPath": "a43",
"m_iRowNum": 6,
"m_iColNum": 2,
"m_bLimitJump": 1,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Quốc Chiến-Cô Đảo Đoạt Kì",
"m_id": 144,
"m_strPath": "a44",
"m_iRowNum": 1,
"m_iColNum": 1,
"m_bLimitJump": 0,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Quốc Chiến-Thủy Tinh Tranh Đoạt",
"m_id": 145,
"m_strPath": "a45",
"m_iRowNum": 1,
"m_iColNum": 1,
"m_bLimitJump": 0,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Quốc Chiến-Đoạn Kiều Đối Trì",
"m_id": 146,
"m_strPath": "a46",
"m_iRowNum": 1,
"m_iColNum": 1,
"m_bLimitJump": 0,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Lạc Nhật Cốc",
"m_id": 147,
"m_strPath": "a47",
"m_iRowNum": 1,
"m_iColNum": 1,
"m_bLimitJump": 1,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Bất Xá Đường",
"m_id": 148,
"m_strPath": "a48",
"m_iRowNum": 1,
"m_iColNum": 1,
"m_bLimitJump": 0,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Linh Đàn Huyễn Cảnh",
"m_id": 150,
"m_strPath": "a50",
"m_iRowNum": 1,
"m_iColNum": 1,
"m_bLimitJump": 0,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Long Ẩn Quật",
"m_id": 149,
"m_strPath": "a49",
"m_iRowNum": 1,
"m_iColNum": 1,
"m_bLimitJump": 0,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Linh Độ Đinh Châu",
"m_id": 161,
"m_strPath": "a61",
"m_iRowNum": 3,
"m_iColNum": 4,
"m_bLimitJump": 0,
"m_routeFiles": [
"r1_1-c1_2-l0"
],
"m_content": "{}"
},
{
"m_strName": "Khung Thế Giới",
"m_id": 162,
"m_strPath": "a62",
"m_iRowNum": 3,
"m_iColNum": 4,
"m_bLimitJump": 0,
"m_routeFiles": [
"r1_1-c1_2-l0"
],
"m_content": "{}"
},
{
"m_strName": "Nhân Giới",
"m_id": 163,
"m_strPath": "a63",
"m_iRowNum": 4,
"m_iColNum": 4,
"m_bLimitJump": 0,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Lưu Ngân Cung",
"m_id": 166,
"m_strPath": "a66",
"m_iRowNum": 1,
"m_iColNum": 1,
"m_bLimitJump": 1,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Phục Ba Đường",
"m_id": 167,
"m_strPath": "a67",
"m_iRowNum": 1,
"m_iColNum": 1,
"m_bLimitJump": 0,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Mô thức Câu chuyện Nhân Giới",
"m_id": 168,
"m_strPath": "a68",
"m_iRowNum": 4,
"m_iColNum": 4,
"m_bLimitJump": 0,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Bồng Minh Động",
"m_id": 169,
"m_strPath": "a69",
"m_iRowNum": 1,
"m_iColNum": 1,
"m_bLimitJump": 1,
"m_routeFiles": [
"r0_0-c0_0-l0"
],
"m_content": "{}"
},
{
"m_strName": "Vận Mệnh Ma Phương",
"m_id": 170,
"m_strPath": "a70",
"m_iRowNum": 3,
"m_iColNum": 3,
"m_bLimitJump": 1,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Thiện Long Cốc",
"m_id": 171,
"m_strPath": "a71",
"m_iRowNum": 4,
"m_iColNum": 3,
"m_bLimitJump": 0,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Tru Thiên Phù Đồ Tháp",
"m_id": 172,
"m_strPath": "a72",
"m_iRowNum": 1,
"m_iColNum": 1,
"m_bLimitJump": 1,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Tru Thiên Phù Đồ Tháp",
"m_id": 173,
"m_strPath": "a72",
"m_iRowNum": 1,
"m_iColNum": 1,
"m_bLimitJump": 1,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Tru Thiên Phù Đồ Tháp",
"m_id": 174,
"m_strPath": "a72",
"m_iRowNum": 1,
"m_iColNum": 1,
"m_bLimitJump": 1,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Tru Thiên Phù Đồ Tháp",
"m_id": 175,
"m_strPath": "a72",
"m_iRowNum": 1,
"m_iColNum": 1,
"m_bLimitJump": 1,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Thiên Hạ Đệ Nhất Tỉ Võ Đại Hội",
"m_id": 177,
"m_strPath": "a77",
"m_iRowNum": 2,
"m_iColNum": 1,
"m_bLimitJump": 0,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Huyễn Hải Kì Đàm",
"m_id": 176,
"m_strPath": "a76",
"m_iRowNum": 3,
"m_iColNum": 3,
"m_bLimitJump": 0,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Lăng Vân Giới",
"m_id": 180,
"m_strPath": "a80",
"m_iRowNum": 3,
"m_iColNum": 3,
"m_bLimitJump": 0,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Lăng Vân Giới",
"m_id": 181,
"m_strPath": "a80",
"m_iRowNum": 3,
"m_iColNum": 3,
"m_bLimitJump": 0,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Lăng Vân Giới",
"m_id": 182,
"m_strPath": "a80",
"m_iRowNum": 3,
"m_iColNum": 3,
"m_bLimitJump": 0,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Lăng Vân Giới",
"m_id": 183,
"m_strPath": "a80",
"m_iRowNum": 3,
"m_iColNum": 3,
"m_bLimitJump": 0,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Đấu trường Kiếm Tiên Thành",
"m_id": 201,
"m_strPath": "b01",
"m_iRowNum": 1,
"m_iColNum": 1,
"m_bLimitJump": 0,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Đấu trường Vạn Hóa Thành",
"m_id": 202,
"m_strPath": "b02",
"m_iRowNum": 1,
"m_iColNum": 1,
"m_bLimitJump": 0,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Đấu trường Tích Vũ Thành",
"m_id": 203,
"m_strPath": "b03",
"m_iRowNum": 1,
"m_iColNum": 1,
"m_bLimitJump": 0,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Đấu trường Tổ Long Thành",
"m_id": 204,
"m_strPath": "b04",
"m_iRowNum": 1,
"m_iColNum": 1,
"m_bLimitJump": 1,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Huyễn Sa Thận Cảnh",
"m_id": 213,
"m_strPath": "random03",
"m_iRowNum": 1,
"m_iColNum": 1,
"m_bLimitJump": 1,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Mê Sa Huyễn Cảnh",
"m_id": 214,
"m_strPath": "random03",
"m_iRowNum": 1,
"m_iColNum": 1,
"m_bLimitJump": 1,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Thành Chiến 1",
"m_id": 230,
"m_strPath": "b30",
"m_iRowNum": 1,
"m_iColNum": 1,
"m_bLimitJump": 0,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Thành Chiến 2",
"m_id": 231,
"m_strPath": "b30",
"m_iRowNum": 1,
"m_iColNum": 1,
"m_bLimitJump": 0,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Thành Chiến 3",
"m_id": 232,
"m_strPath": "b30",
"m_iRowNum": 1,
"m_iColNum": 1,
"m_bLimitJump": 0,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Thành Chiến 4",
"m_id": 233,
"m_strPath": "b30",
"m_iRowNum": 1,
"m_iColNum": 1,
"m_bLimitJump": 0,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Thành Chiến 5",
"m_id": 234,
"m_strPath": "b30",
"m_iRowNum": 1,
"m_iColNum": 1,
"m_bLimitJump": 0,
"m_routeFiles": [
],
"m_content": "{}"
},
{
"m_strName": "Thành Chiến 6",
"m_id": 235,
"m_strPath": "b30",
"m_iRowNum": 1,
"m_iColNum": 1,
"m_bLimitJump": 0,
"m_routeFiles": [
],
"m_content": "{}"
}
]
+7
View File
@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 4dde960e818ed37448ebde2cbe895031
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: ac7d3a4570c17794eba58d06044d53b0
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -256,5 +256,66 @@ namespace BrewMonster.Common
public bool IsEnd() { return m_Script.pCurIndex >= m_Script.pFileBuf.Length; }
// Get current line
public int GetCurLine() { return m_Script.iLine; }
/* Search specified token. This function get next token and check whether it match
specified string, if match, then stop and return true, otherwise get next token
again until all file is checked or token is found.
Note: This will be crossing-line search.
Return true for success, otherwise return false.
wszToken: specified token will be searched
bCaseSensitive: true, case sensitive
*/
public bool MatchToken(ushort[] wszToken, bool bCaseSensitive)
{
while (GetNextToken(true))
{
if (bCaseSensitive)
{
if (string.Compare(ByteToStringUtils.UshortArrayToUnicodeString(m_szToken),
ByteToStringUtils.UshortArrayToUnicodeString(wszToken),
StringComparison.Ordinal) == 0)
{
return true;
}
}
else
{
if (string.Compare(ByteToStringUtils.UshortArrayToUnicodeString(m_szToken),
ByteToStringUtils.UshortArrayToUnicodeString(wszToken),
StringComparison.OrdinalIgnoreCase) == 0)
{
return true;
}
}
}
return false;
}
public bool MatchToken(string wszToken, bool bCaseSensitive)
{
while (GetNextToken(true))
{
if (bCaseSensitive)
{
if (string.Compare(ByteToStringUtils.UshortArrayToUnicodeString(m_szToken),
wszToken, StringComparison.Ordinal) == 0)
{
return true;
}
}
else
{
if (string.Compare(ByteToStringUtils.UshortArrayToUnicodeString(m_szToken),
wszToken, StringComparison.OrdinalIgnoreCase) == 0)
{
return true;
}
}
}
return false;
}
}
}
@@ -303,10 +303,10 @@ namespace BrewMonster
fSpeedH = -fSpeedH;
}
//int idInst = g_pGame.GetGameRun().GetWorld().GetInstanceID();
//CECInstance pInstance = g_pGame.GetGameRun().GetInstance(idInst);
//if (pInstance.GetLimitJump())
//fGravity *= 4.0f;
int idInst = EC_Game.GetGameRun().GetWorld().GetInstanceID();
CECInstance pInstance = EC_Game.GetGameRun().GetInstance(idInst);
if (pInstance.GetLimitJump())
fGravity *= 4.0f;
Vector3 posStart = EC_Utility.ToVector3(m_pHost.m_aabbServer.Center);
CDR_INFO cdr = m_pHost.m_CDRInfo;
cdr.vCenter = m_pHost.m_aabbServer.Center;
@@ -0,0 +1,370 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using UnityEditor;
using UnityEngine;
namespace BrewMonster.Utils
{
public class JsonScriptableObjectImporterWindow : EditorWindow
{
private const string DefaultFieldTemplate =
@"public string m_strName;
public int m_id;
public string m_strPath;
public int m_iRowNum;
public int m_iColNum;
public int m_bLimitJump;
public string[] m_routeFiles;
public string m_content;";
private TextAsset jsonFile;
private DefaultAsset outputFolder;
private string dataTypeName = "JsonData";
private string assetTypeName = "JsonDataAsset";
private string assetFileName = "JsonDataAsset";
private string fieldDefinitions = DefaultFieldTemplate;
private bool generateStruct;
private Vector2 scrollPosition;
[MenuItem("Tools/JSON ScriptableObject Importer")]
public static void OpenWindow()
{
GetWindow<JsonScriptableObjectImporterWindow>("JSON -> ScriptableObject");
}
private void OnGUI()
{
scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition);
EditorGUILayout.Space();
EditorGUILayout.HelpBox(
"1. Keo file JSON vao o ben duoi.\n" +
"2. Dien ten type va field cho struct/class.\n" +
"3. Bam Generate Runtime Types de tao file C# trong project Unity.\n" +
"4. Cho Unity compile xong, bam Create Asset From JSON.",
MessageType.Info);
DrawJsonDropZone();
EditorGUILayout.Space();
jsonFile = (TextAsset)EditorGUILayout.ObjectField("JSON Input", jsonFile, typeof(TextAsset), false);
outputFolder = (DefaultAsset)EditorGUILayout.ObjectField("Output Folder", outputFolder, typeof(DefaultAsset), false);
EditorGUILayout.Space();
EditorGUILayout.LabelField("Type Settings", EditorStyles.boldLabel);
dataTypeName = EditorGUILayout.TextField("Data Type Name", dataTypeName);
assetTypeName = EditorGUILayout.TextField("Asset Type Name", assetTypeName);
assetFileName = EditorGUILayout.TextField("Asset File Name", assetFileName);
generateStruct = EditorGUILayout.Toggle("Generate As Struct", generateStruct);
EditorGUILayout.Space();
EditorGUILayout.LabelField("Struct/Class Fields", EditorStyles.boldLabel);
EditorGUILayout.HelpBox(
"Dien cac field theo cu phap C#. Vi du: public string name; public int id; public string[] tags;",
MessageType.None);
fieldDefinitions = EditorGUILayout.TextArea(fieldDefinitions, GUILayout.MinHeight(220));
EditorGUILayout.Space();
using (new EditorGUILayout.HorizontalScope())
{
if (GUILayout.Button("Generate Runtime Types", GUILayout.Height(32)))
{
GenerateRuntimeTypes();
}
if (GUILayout.Button("Create Asset From JSON", GUILayout.Height(32)))
{
CreateAssetFromJson();
}
}
EditorGUILayout.EndScrollView();
}
private void DrawJsonDropZone()
{
Rect dropArea = GUILayoutUtility.GetRect(0f, 70f, GUILayout.ExpandWidth(true));
GUI.Box(dropArea, "Drop file JSON vao day", EditorStyles.helpBox);
Event currentEvent = Event.current;
if (!dropArea.Contains(currentEvent.mousePosition))
{
return;
}
if (currentEvent.type == EventType.DragUpdated || currentEvent.type == EventType.DragPerform)
{
DragAndDrop.visualMode = DragAndDropVisualMode.Copy;
if (currentEvent.type == EventType.DragPerform)
{
DragAndDrop.AcceptDrag();
foreach (UnityEngine.Object draggedObject in DragAndDrop.objectReferences)
{
if (draggedObject is TextAsset textAsset)
{
jsonFile = textAsset;
GUI.FocusControl(null);
break;
}
}
}
currentEvent.Use();
}
}
private void GenerateRuntimeTypes()
{
if (!ValidateGenerateInputs())
{
return;
}
string folderPath = AssetDatabase.GetAssetPath(outputFolder);
string sanitizedDataTypeName = SanitizeIdentifier(dataTypeName, "JsonData");
string sanitizedAssetTypeName = SanitizeIdentifier(assetTypeName, sanitizedDataTypeName + "Asset");
string outputPath = Path.Combine(folderPath, sanitizedAssetTypeName + ".cs").Replace("\\", "/");
string source = BuildRuntimeSource(
sanitizedDataTypeName,
sanitizedAssetTypeName,
generateStruct,
fieldDefinitions);
File.WriteAllText(outputPath, source, new UTF8Encoding(false));
AssetDatabase.Refresh();
Debug.Log("Generated runtime types at: " + outputPath);
EditorUtility.DisplayDialog(
"Generate Complete",
"Da tao file C# runtime. Hay doi Unity compile xong roi bam 'Create Asset From JSON'.",
"OK");
}
private void CreateAssetFromJson()
{
if (!ValidateImportInputs())
{
return;
}
string sanitizedDataTypeName = SanitizeIdentifier(dataTypeName, "JsonData");
string sanitizedAssetTypeName = SanitizeIdentifier(assetTypeName, sanitizedDataTypeName + "Asset");
string jsonText = jsonFile.text;
Type dataType = FindType(sanitizedDataTypeName);
Type assetType = FindType(sanitizedAssetTypeName);
Type wrapperType = FindType(sanitizedDataTypeName + "ArrayWrapper");
if (dataType == null || assetType == null || wrapperType == null)
{
EditorUtility.DisplayDialog(
"Types Not Ready",
"Khong tim thay cac type vua generate. Hay chac chan Unity da compile xong sau khi bam Generate.",
"OK");
return;
}
ScriptableObject asset = ScriptableObject.CreateInstance(assetType);
SetFieldIfExists(assetType, asset, "rawJson", jsonText);
string trimmedJson = jsonText.TrimStart();
if (trimmedJson.StartsWith("[", StringComparison.Ordinal))
{
object wrapper = JsonUtility.FromJson("{\"items\":" + jsonText + "}", wrapperType);
object items = wrapperType.GetField("items", BindingFlags.Public | BindingFlags.Instance)?.GetValue(wrapper);
SetFieldIfExists(assetType, asset, "items", items);
}
else
{
object data = JsonUtility.FromJson(jsonText, dataType);
SetFieldIfExists(assetType, asset, "data", data);
}
string folderPath = AssetDatabase.GetAssetPath(outputFolder);
string requestedName = string.IsNullOrWhiteSpace(assetFileName) ? sanitizedAssetTypeName : assetFileName.Trim();
string assetPath = AssetDatabase.GenerateUniqueAssetPath(
Path.Combine(folderPath, requestedName + ".asset").Replace("\\", "/"));
AssetDatabase.CreateAsset(asset, assetPath);
EditorUtility.SetDirty(asset);
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
Selection.activeObject = asset;
Debug.Log("Created ScriptableObject asset at: " + assetPath);
EditorUtility.DisplayDialog("Import Complete", "Da tao asset tu JSON thanh cong.", "OK");
}
private bool ValidateGenerateInputs()
{
if (outputFolder == null)
{
EditorUtility.DisplayDialog("Missing Output Folder", "Hay chon folder de tao file C# runtime.", "OK");
return false;
}
string folderPath = AssetDatabase.GetAssetPath(outputFolder);
if (!AssetDatabase.IsValidFolder(folderPath))
{
EditorUtility.DisplayDialog("Invalid Folder", "Output Folder phai la mot folder trong Assets.", "OK");
return false;
}
if (string.IsNullOrWhiteSpace(dataTypeName) || string.IsNullOrWhiteSpace(assetTypeName))
{
EditorUtility.DisplayDialog("Missing Type Names", "Hay nhap Data Type Name va Asset Type Name.", "OK");
return false;
}
if (string.IsNullOrWhiteSpace(fieldDefinitions))
{
EditorUtility.DisplayDialog("Missing Fields", "Hay nhap field cho struct/class.", "OK");
return false;
}
return true;
}
private bool ValidateImportInputs()
{
if (!ValidateGenerateInputs())
{
return false;
}
if (jsonFile == null)
{
EditorUtility.DisplayDialog("Missing JSON", "Hay keo hoac chon file JSON dau vao.", "OK");
return false;
}
return true;
}
private static string BuildRuntimeSource(
string dataType,
string assetType,
bool asStruct,
string fields)
{
string keyword = asStruct ? "struct" : "class";
string createMenuName = "Tools/Generated/" + assetType;
StringBuilder builder = new StringBuilder();
builder.AppendLine("using System;");
builder.AppendLine("using UnityEngine;");
builder.AppendLine();
builder.AppendLine("[Serializable]");
builder.AppendLine("public " + keyword + " " + dataType);
builder.AppendLine("{");
foreach (string line in NormalizeFieldLines(fields))
{
builder.AppendLine(" " + line);
}
builder.AppendLine("}");
builder.AppendLine();
builder.AppendLine("[CreateAssetMenu(fileName = \"" + assetType + "\", menuName = \"" + createMenuName + "\")]");
builder.AppendLine("public class " + assetType + " : ScriptableObject");
builder.AppendLine("{");
builder.AppendLine(" public " + dataType + " data;");
builder.AppendLine(" public " + dataType + "[] items;");
builder.AppendLine(" [TextArea(5, 20)]");
builder.AppendLine(" public string rawJson;");
builder.AppendLine("}");
builder.AppendLine();
builder.AppendLine("[Serializable]");
builder.AppendLine("public class " + dataType + "ArrayWrapper");
builder.AppendLine("{");
builder.AppendLine(" public " + dataType + "[] items;");
builder.AppendLine("}");
return builder.ToString();
}
private static IEnumerable<string> NormalizeFieldLines(string fields)
{
return fields
.Replace("\r\n", "\n")
.Split('\n')
.Select(line => line.Trim())
.Where(line => !string.IsNullOrWhiteSpace(line));
}
private static void SetFieldIfExists(Type targetType, object target, string fieldName, object value)
{
FieldInfo field = targetType.GetField(fieldName, BindingFlags.Public | BindingFlags.Instance);
if (field != null)
{
field.SetValue(target, value);
}
}
private static string SanitizeIdentifier(string value, string fallback)
{
if (string.IsNullOrWhiteSpace(value))
{
return fallback;
}
List<char> chars = new List<char>();
foreach (char character in value.Trim())
{
if (char.IsLetterOrDigit(character) || character == '_')
{
chars.Add(character);
}
}
if (chars.Count == 0)
{
return fallback;
}
if (!char.IsLetter(chars[0]) && chars[0] != '_')
{
chars.Insert(0, '_');
}
return new string(chars.ToArray());
}
private static Type FindType(string typeName)
{
foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
{
Type directMatch = assembly.GetType(typeName);
if (directMatch != null)
{
return directMatch;
}
Type fallbackMatch = GetTypesSafely(assembly).FirstOrDefault(type => type.Name == typeName);
if (fallbackMatch != null)
{
return fallbackMatch;
}
}
return null;
}
private static IEnumerable<Type> GetTypesSafely(Assembly assembly)
{
try
{
return assembly.GetTypes();
}
catch (ReflectionTypeLoadException exception)
{
return exception.Types.Where(type => type != null);
}
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: f4e64c3f6188cad4788ef2f489c614db
@@ -0,0 +1,30 @@
using System;
using UnityEngine;
[Serializable]
public struct instanceStruct
{
public string m_strName;
public int m_id;
public string m_strPath;
public int m_iRowNum;
public int m_iColNum;
public int m_bLimitJump;
public string[] m_routeFiles;
public string m_content;
}
[CreateAssetMenu(fileName = "instanceDataAsset", menuName = "Tools/Generated/instanceDataAsset")]
public class instanceDataAsset : ScriptableObject
{
public instanceStruct data;
public instanceStruct[] items;
[TextArea(5, 20)]
public string rawJson;
}
[Serializable]
public class instanceStructArrayWrapper
{
public instanceStruct[] items;
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: c6cd16271da5b06429a4ead9732e46b5
@@ -1,4 +1,5 @@
using BrewMonster.Common;
using ModelRenderer.Scripts.Common;
using System;
using System.Collections.Generic;
using UnityEngine;
@@ -8,7 +9,7 @@ namespace BrewMonster.Scripts
public class CECInstance
{
int m_id = 161; // Instance ID
ushort[] m_strName; // Instance name
string m_strName; // Instance name
string m_strPath; // Path
int m_iRowNum = 3; // Number of map row
int m_iColNum = 4; // Number of map column
@@ -36,7 +37,7 @@ namespace BrewMonster.Scripts
// Get instance ID
public int GetID() { return m_id; }
// Get instance name
public ushort[] GetName() { return m_strName; }
public string GetName() { return m_strName; }
// Get instance data path
public string GetPath() { return m_strPath; }
// Get row and column number of map
@@ -50,8 +51,16 @@ namespace BrewMonster.Scripts
}
// Load instance information from file
public bool Load(AWScriptFile psf)
public bool Load(instanceStruct data)
{
m_id = data.m_id;
m_strName = data.m_strName;
m_strPath = data.m_strPath;
m_iRowNum = data.m_iRowNum;
m_iColNum = data.m_iColNum;
m_bLimitJump = (data.m_bLimitJump != 0);
m_routeFiles.Clear();
m_routeFiles.AddRange(data.m_routeFiles);
return true;
}
}
+44 -6
View File
@@ -17,6 +17,7 @@ using PerfectWorld.Scripts.Shop;
using Unity.Cinemachine;
using Unity.VisualScripting;
using UnityEngine;
using BrewMonster.Common;
public partial class CECGameRun : ITickable
{
@@ -109,11 +110,19 @@ public partial class CECGameRun : ITickable
// Load instance information
//if (!LoadInstanceInfo("Configs\\instance.txt"))
//{
// glb_ErrorOutput(ECERR_FAILEDTOCALL, "CECGameRun::Init", __LINE__);
// return false;
// //glb_ErrorOutput(ECERR_FAILEDTOCALL, "CECGameRun::Init", __LINE__);
// //return false;
//}
if (!m_InstTab.ContainsKey(161))
m_InstTab.Add(161, new CECInstance());
var instanceOB = Resources.Load<instanceDataAsset>("instance");
for(int i = 0; i < instanceOB.items.Length; i++)
{
if (!m_InstTab.ContainsKey(instanceOB.items[i].m_id))
{
var cecInstance = new CECInstance();
cecInstance.Load(instanceOB.items[i]);
m_InstTab.Add(instanceOB.items[i].m_id, cecInstance);
}
}
AddressableManager.Instance.OnDispose += Dispose;
if (m_pWorld == null)
m_pWorld = new CECWorld();
@@ -1171,8 +1180,37 @@ public partial class CECGameRun : ITickable
return true;
}
// Load instance information from file
bool LoadInstanceInfo(string szFile)
{
// AWScriptFile sf = new AWScriptFile();
//if (!sf.Open(szFile))
//{
// //a_LogOutput(1, "CECGameRun::LoadInstanceInfo, Failed to load %s", szFile);
// return false;
//}
// CECInstance pInst;
// while (sf.PeekNextToken(true))
// {
// pInst = new CECInstance();
// if (pInst == null || !pInst.Load(sf))
// {
// //a_LogOutput(1, "CECGameRun::LoadInstanceInfo, Failed to read %s near line:%d", szFile, sf.GetCurLine());
// return false;
// }
// if (!m_InstTab.ContainsKey(pInst.GetID()))
// {
// // ID collsion ?
// m_InstTab.Add(pInst.GetID(), pInst);
// }
// }
// sf.Close();
return true;
}
}
public enum GameState