diff --git a/main/source/cl_dll/cl_dll.vcproj b/main/source/cl_dll/cl_dll.vcproj
index 9aafede..1af1434 100644
--- a/main/source/cl_dll/cl_dll.vcproj
+++ b/main/source/cl_dll/cl_dll.vcproj
@@ -170,6 +170,152 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -193,6 +339,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -210,6 +370,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -227,6 +401,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -244,6 +432,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -261,6 +463,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -278,6 +494,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -295,6 +525,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -312,6 +556,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -329,6 +587,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -346,6 +618,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -363,6 +649,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -380,6 +680,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -397,6 +711,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -414,6 +742,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -431,6 +773,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -448,6 +804,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -465,6 +835,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -482,6 +866,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -499,6 +897,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -516,6 +928,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -533,6 +959,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -550,6 +990,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -567,6 +1021,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -584,6 +1052,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -601,6 +1083,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -618,6 +1114,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -635,6 +1145,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -654,6 +1178,22 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -671,6 +1211,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -688,6 +1242,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -705,6 +1273,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -722,6 +1304,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -739,6 +1335,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -756,6 +1366,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -773,6 +1397,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -790,6 +1428,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -807,6 +1459,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -824,6 +1490,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -841,6 +1521,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -858,6 +1552,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -875,6 +1583,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -892,6 +1614,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -909,6 +1645,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -926,6 +1676,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -943,6 +1707,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -960,6 +1738,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -977,6 +1769,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -994,6 +1800,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1011,6 +1831,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1028,6 +1862,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1045,6 +1893,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1062,6 +1924,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1079,6 +1955,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1096,6 +1986,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1113,6 +2017,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1130,6 +2048,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1147,6 +2079,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1164,6 +2110,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1181,6 +2141,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1198,6 +2172,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1215,6 +2203,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1232,6 +2234,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1249,6 +2265,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1266,6 +2296,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1303,6 +2361,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1320,6 +2392,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1337,6 +2423,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1354,6 +2454,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1378,6 +2492,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1395,6 +2523,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1421,6 +2563,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1441,6 +2597,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1458,6 +2628,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1475,6 +2659,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1492,6 +2690,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1509,6 +2721,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1526,6 +2752,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1543,6 +2783,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1560,6 +2814,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1577,6 +2845,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1594,6 +2876,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1611,6 +2907,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1628,6 +2938,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1645,6 +2969,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1662,6 +3000,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1679,6 +3031,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1705,6 +3071,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1722,6 +3102,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1739,6 +3133,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1756,6 +3164,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1773,6 +3195,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1790,6 +3226,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1807,6 +3257,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1824,6 +3288,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1841,6 +3319,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1858,6 +3350,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1875,6 +3381,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1892,6 +3412,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1909,6 +3443,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1926,6 +3474,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2124,6 +3686,18 @@
Name="VCCLCompilerTool"
ObjectFile="$(IntDir)/$(InputName)1.obj"/>
+
+
+
+
+
+
@@ -2145,6 +3719,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2166,6 +3754,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2184,6 +3786,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2211,6 +3827,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2238,6 +3868,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2259,6 +3903,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2289,6 +3947,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2310,6 +3982,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2334,6 +4020,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2355,6 +4055,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2376,6 +4090,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2397,6 +4125,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2418,6 +4160,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2439,6 +4195,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2460,6 +4230,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2484,6 +4268,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2504,6 +4302,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2524,6 +4336,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2544,6 +4370,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2564,6 +4404,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2581,6 +4435,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2601,6 +4469,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2621,6 +4503,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2647,6 +4543,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2667,6 +4577,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2684,6 +4608,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2704,6 +4642,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2721,6 +4673,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2744,6 +4710,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2761,6 +4741,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2781,6 +4775,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2801,6 +4809,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2821,6 +4843,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2859,6 +4895,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2879,6 +4929,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2899,6 +4963,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2919,6 +4997,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2939,6 +5031,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2959,6 +5065,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2979,6 +5099,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2996,6 +5130,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -3016,6 +5164,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -3033,6 +5195,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -3053,6 +5229,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -3070,6 +5260,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -3090,6 +5294,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -3110,6 +5328,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -3130,6 +5362,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -3150,6 +5396,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -3170,6 +5430,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -3196,6 +5470,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -3222,6 +5510,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -3242,6 +5544,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -3262,6 +5578,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -3288,6 +5618,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -3308,6 +5652,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -3331,6 +5689,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -3351,6 +5723,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -3371,6 +5757,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -3391,6 +5791,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -3411,6 +5825,20 @@
Optimization="2"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
diff --git a/main/source/dlls/hl.vcproj b/main/source/dlls/hl.vcproj
index 267a827..ef09227 100644
--- a/main/source/dlls/hl.vcproj
+++ b/main/source/dlls/hl.vcproj
@@ -47,7 +47,7 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -186,6 +334,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -203,6 +365,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -220,6 +396,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -237,6 +427,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -254,6 +458,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -271,6 +489,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -288,6 +520,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -305,6 +551,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -322,6 +582,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -339,6 +613,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -356,6 +644,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -373,6 +675,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -390,6 +706,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -407,6 +737,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -424,6 +768,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -441,6 +799,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -458,6 +830,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -475,6 +861,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -492,6 +892,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -509,6 +923,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -526,6 +954,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -543,6 +985,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -560,6 +1016,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -577,6 +1047,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -594,6 +1078,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -611,6 +1109,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -628,6 +1140,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -645,6 +1171,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -662,6 +1202,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -679,6 +1233,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -696,6 +1264,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -713,6 +1295,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -730,6 +1326,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -747,6 +1357,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -764,6 +1388,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -781,6 +1419,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -798,6 +1450,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -815,6 +1481,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -832,6 +1512,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -849,6 +1543,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -866,6 +1574,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -883,6 +1605,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -900,6 +1636,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -917,6 +1667,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -934,6 +1698,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -951,6 +1729,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -968,6 +1760,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -985,6 +1791,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1002,6 +1822,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1019,6 +1853,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1036,6 +1884,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1053,6 +1915,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1233,6 +2123,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1256,6 +2160,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1276,6 +2194,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1296,6 +2228,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1313,6 +2259,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1333,6 +2293,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1353,6 +2327,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1373,6 +2361,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1393,6 +2395,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1422,6 +2438,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1442,6 +2472,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1462,6 +2506,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1482,6 +2540,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1502,6 +2574,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1522,6 +2608,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1542,6 +2642,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1562,6 +2676,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1582,6 +2710,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1602,6 +2744,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1640,6 +2796,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1660,6 +2830,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1680,6 +2864,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1700,6 +2898,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1720,6 +2932,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1740,6 +2966,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1760,6 +3000,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1780,6 +3034,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1797,6 +3065,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1814,6 +3096,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1834,6 +3130,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1854,6 +3164,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1877,6 +3201,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1900,6 +3238,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1920,6 +3272,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1940,6 +3306,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1960,6 +3340,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -1980,6 +3374,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2000,6 +3408,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2026,6 +3448,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2052,6 +3488,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2072,6 +3522,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2092,6 +3556,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2112,6 +3590,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2132,6 +3624,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2158,6 +3664,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2178,6 +3698,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2201,6 +3735,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2218,6 +3766,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2244,6 +3806,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2264,6 +3840,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2281,6 +3871,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2298,6 +3902,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2315,6 +3933,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2332,6 +3964,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2349,6 +3995,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2366,6 +4026,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2383,6 +4057,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2400,6 +4088,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2417,6 +4119,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2434,6 +4150,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2451,6 +4181,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2468,6 +4212,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2485,6 +4243,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2502,6 +4274,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2528,6 +4314,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2545,6 +4345,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2562,6 +4376,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2579,6 +4407,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2596,6 +4438,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2613,6 +4469,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2630,6 +4500,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2647,6 +4531,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2664,6 +4562,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2681,6 +4593,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2698,6 +4624,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2715,6 +4655,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2732,6 +4686,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2749,6 +4717,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2766,6 +4748,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
+
+
+
+
+
+
@@ -2810,6 +4820,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2830,6 +4854,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2850,6 +4888,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
@@ -2870,6 +4922,20 @@
Optimization="0"
AdditionalIncludeDirectories=""/>
+
+
+
+
+
+
diff --git a/main/source/mod/AvHNexusClient.cpp b/main/source/mod/AvHNexusClient.cpp
index ccbbd8b..dc64b9e 100644
--- a/main/source/mod/AvHNexusClient.cpp
+++ b/main/source/mod/AvHNexusClient.cpp
@@ -1,119 +1,138 @@
-#include
-#include "AvHNexusClient.h"
-#include "AvHNexusTunnelToServer.h"
-#include "cl_dll/hud.h"
-#include "cl_dll/cl_util.h"
+#ifdef AVH_PLAYTEST_BUILD
+ #define AVH_NO_NEXUS
+#endif
-string BASE64Encode(const byte_string& input);
-int __MsgFunc_NexusData(const char *pszName, int iSize, void *pbuf);
+#ifdef AVH_NO_NEXUS
+ #include
+ using std::string;
+ #include "AvHNexusClient.h"
-bool AvHNexus::send(const unsigned char* data, const size_t length)
-{
- byte_string raw_data(data,length);
+ bool AvHNexus::send(const unsigned char* data, const size_t length) { return false; }
+ bool AvHNexus::recv(const unsigned char* data, const size_t length) { return false; }
- string cmdline("NexusData ");
- cmdline += BASE64Encode(raw_data);
- cmdline += "\n";
+ void AvHNexus::startup(void) {}
+ void AvHNexus::shutdown(void) {}
- //ugliness due to pfnClientCmd wanting a non-const ptr
- char* ptr = new char[cmdline.length()+1];
- strncpy(ptr,cmdline.c_str(),cmdline.length());
- ptr[cmdline.length()] = '\0';
- gEngfuncs.pfnClientCmd(ptr);
- delete[] ptr;
+ bool AvHNexus::login(const string& name, const string& password) { return true; }
+ bool AvHNexus::logout(void) { return true; }
+#else
+ #include
+ #include "AvHNexusClient.h"
+ #include "AvHNexusTunnelToServer.h"
+ #include "cl_dll/hud.h"
+ #include "cl_dll/cl_util.h"
- return true;
-}
+ string BASE64Encode(const byte_string& input);
+ int __MsgFunc_NexusData(const char *pszName, int iSize, void *pbuf);
-bool AvHNexus::recv(const unsigned char* data, const size_t length)
-{
- byte_string raw_data(data,length);
- AvHNexus::TunnelToServer::getInstance()->insertMessage(raw_data);
- return true;
-}
-
-void AvHNexus::startup(void)
-{
- gEngfuncs.pfnHookUserMsg("NexusBytes", __MsgFunc_NexusData);
-// Nexus::setTunnelToServer(AvHNexus::TunnelToServer::getInstance());
-}
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Incominng message handler
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-int __MsgFunc_NexusData(const char *pszName, int iSize, void *pbuf)
-{
- AvHNexus::recv((unsigned char*)pbuf, iSize);
- return iSize;
-}
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Base 64 encoder
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-char Base64EncodeTable[65] = {
- 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', // 0- 7
- 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', // 8-15
- 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', //16-23
- 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', //24-31
- 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', //32-39
- 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', //40-47
- 'w', 'x', 'y', 'z', '0', '1', '2', '3', //48-55
- '4', '5', '6', '7', '8', '9', '+', '/', //56-63
- '=' }; //64 = padding
-
-//debugged and working properly... do not disturb.
-string BASE64Encode(const byte_string& input)
-{
- string output;
- const byte* data = input.c_str();
- size_t length = input.length();
- int value, value2;
-
- //handle input in 3 byte blocks
- while( length > 2 )
+ bool AvHNexus::send(const unsigned char* data, const size_t length)
{
- value = data[0]; value >>= 2;
- output.push_back(Base64EncodeTable[value]);
- value = data[0]; value2 = data[1];
- value &= 0x03; value <<= 4;
- value2 &= 0xF0; value2 >>= 4; value |= value2;
- output.push_back(Base64EncodeTable[value]);
- value = data[1]; value2 = data[2];
- value &= 0x0F; value <<= 2;
- value2 &= 0xC0; value2 >>= 6; value |= value2;
- output.push_back(Base64EncodeTable[value]);
- value = data[2]; value &= 0x3F;
- output.push_back(Base64EncodeTable[value]);
- data += 3; length -= 3;
+ byte_string raw_data(data,length);
+
+ string cmdline("NexusData ");
+ cmdline += BASE64Encode(raw_data);
+ cmdline += "\n";
+
+ //ugliness due to pfnClientCmd wanting a non-const ptr
+ char* ptr = new char[cmdline.length()+1];
+ strncpy(ptr,cmdline.c_str(),cmdline.length());
+ ptr[cmdline.length()] = '\0';
+ gEngfuncs.pfnClientCmd(ptr);
+ delete[] ptr;
+
+ return true;
}
- //handle remainder
- switch(length)
+ bool AvHNexus::recv(const unsigned char* data, const size_t length)
{
- case 0: //no remainder to process
- break;
- case 1: //process and pad with two =
- value = data[0]; value >>= 2;
- output.push_back(Base64EncodeTable[value]);
- value = data[0]; value &= 0x03; value <<= 4;
- output.push_back(Base64EncodeTable[value]);
- output.push_back(Base64EncodeTable[64]);
- output.push_back(Base64EncodeTable[64]);
- break;
- case 2: //process and pad with one =
- value = data[0]; value >>= 2;
- output.push_back(Base64EncodeTable[value]);
- value = data[0]; value2 = data[1];
- value &= 0x03; value <<= 4;
- value2 &= 0xF0; value2 >>= 4; value |= value2;
- output.push_back(Base64EncodeTable[value]);
- value = data[1]; value &= 0x0F; value <<= 2;
- output.push_back(Base64EncodeTable[value]);
- output.push_back(Base64EncodeTable[64]);
- break;
+ byte_string raw_data(data,length);
+ AvHNexus::TunnelToServer::getInstance()->insertMessage(raw_data);
+ return true;
+ }
+
+ void AvHNexus::startup(void)
+ {
+ gEngfuncs.pfnHookUserMsg("NexusBytes", __MsgFunc_NexusData);
+ // Nexus::setTunnelToServer(AvHNexus::TunnelToServer::getInstance());
}
- return output;
-}
\ No newline at end of file
+ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ // Incominng message handler
+ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ int __MsgFunc_NexusData(const char *pszName, int iSize, void *pbuf)
+ {
+ AvHNexus::recv((unsigned char*)pbuf, iSize);
+ return iSize;
+ }
+
+ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ // Base 64 encoder
+ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ char Base64EncodeTable[65] = {
+ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', // 0- 7
+ 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', // 8-15
+ 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', //16-23
+ 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', //24-31
+ 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', //32-39
+ 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', //40-47
+ 'w', 'x', 'y', 'z', '0', '1', '2', '3', //48-55
+ '4', '5', '6', '7', '8', '9', '+', '/', //56-63
+ '=' }; //64 = padding
+
+ //debugged and working properly... do not disturb.
+ string BASE64Encode(const byte_string& input)
+ {
+ string output;
+ const byte* data = input.c_str();
+ size_t length = input.length();
+ int value, value2;
+
+ //handle input in 3 byte blocks
+ while( length > 2 )
+ {
+ value = data[0]; value >>= 2;
+ output.push_back(Base64EncodeTable[value]);
+ value = data[0]; value2 = data[1];
+ value &= 0x03; value <<= 4;
+ value2 &= 0xF0; value2 >>= 4; value |= value2;
+ output.push_back(Base64EncodeTable[value]);
+ value = data[1]; value2 = data[2];
+ value &= 0x0F; value <<= 2;
+ value2 &= 0xC0; value2 >>= 6; value |= value2;
+ output.push_back(Base64EncodeTable[value]);
+ value = data[2]; value &= 0x3F;
+ output.push_back(Base64EncodeTable[value]);
+ data += 3; length -= 3;
+ }
+
+ //handle remainder
+ switch(length)
+ {
+ case 0: //no remainder to process
+ break;
+ case 1: //process and pad with two =
+ value = data[0]; value >>= 2;
+ output.push_back(Base64EncodeTable[value]);
+ value = data[0]; value &= 0x03; value <<= 4;
+ output.push_back(Base64EncodeTable[value]);
+ output.push_back(Base64EncodeTable[64]);
+ output.push_back(Base64EncodeTable[64]);
+ break;
+ case 2: //process and pad with one =
+ value = data[0]; value >>= 2;
+ output.push_back(Base64EncodeTable[value]);
+ value = data[0]; value2 = data[1];
+ value &= 0x03; value <<= 4;
+ value2 &= 0xF0; value2 >>= 4; value |= value2;
+ output.push_back(Base64EncodeTable[value]);
+ value = data[1]; value &= 0x0F; value <<= 2;
+ output.push_back(Base64EncodeTable[value]);
+ output.push_back(Base64EncodeTable[64]);
+ break;
+ }
+
+ return output;
+ }
+#endif
\ No newline at end of file
diff --git a/main/source/mod/AvHNexusServer.cpp b/main/source/mod/AvHNexusServer.cpp
index f3468a9..dde7460 100644
--- a/main/source/mod/AvHNexusServer.cpp
+++ b/main/source/mod/AvHNexusServer.cpp
@@ -1,209 +1,234 @@
-#include
-#include "AvHNexusServer.h"
-#include "AvHNexusTunnelToClient.h"
+#ifdef AVH_PLAYTEST_BUILD
+ #define AVH_NO_NEXUS
+#endif
-#include "NetworkMeter.h"
-extern int g_msgNexusBytes;
+#ifdef AVH_NO_NEXUS
+ #include
+ using std::string;
+ #include "AvHNexusServer.h"
-byte_string BASE64Decode(const string& input);
-Nexus::ServerInfo createServerInfo(void);
+ bool AvHNexus::send(entvars_t* const pev, const unsigned char* data, const unsigned int length) { return false; }
+ bool AvHNexus::recv(entvars_t* const pev, const char* data, const unsigned int length) { return false; }
+ string AvHNexus::getNetworkID(const edict_t* edict) { return ""; }
+ void AvHNexus::handleUnauthorizedJoinTeamAttempt(const edict_t* edict, const unsigned char team_index) {}
+ void AvHNexus::performSpeedTest(void) {}
+ void AvHNexus::processResponses(void) {}
+ void AvHNexus::setGeneratePerformanceData(const edict_t* edict, const bool generate) {}
+ bool AvHNexus::getGeneratePerformanceData(void) { return false; }
+ bool AvHNexus::isRecordingGame(void) { return false; }
+ void AvHNexus::cancelGame(void) {}
+ void AvHNexus::finishGame(void) {}
+ void AvHNexus::startGame(void) {}
+ void AvHNexus::startup(void) {}
+ void AvHNexus::shutdown(void) {}
+#else
+ #include
+ #include "AvHNexusServer.h"
+ #include "AvHNexusTunnelToClient.h"
-//note: we place this here so that we have the possibility of giving out AvHNetworkMessages.cpp
-bool AvHNexus::send(entvars_t* const pev, const unsigned char* data, const unsigned int length)
-{
- if( !pev ) { return false; }
- MESSAGE_BEGIN( MSG_ONE, g_msgNexusBytes, NULL, pev );
- for( int counter = 0; counter < length; counter++ )
- { WRITE_BYTE(data[counter]); }
- MESSAGE_END();
- return true;
-}
+ #include "NetworkMeter.h"
+ extern int g_msgNexusBytes;
-bool AvHNexus::recv(entvars_t* const pev, const char* data, const unsigned int length)
-{
- string base64_message(data,length);
- byte_string message = BASE64Decode(base64_message);
- Nexus::ClientID client = OFFSET(pev);
- TunnelToClient::getInstance()->insertMessage(client,message);
- return true;
-}
+ byte_string BASE64Decode(const string& input);
+ Nexus::ServerInfo createServerInfo(void);
-inline CBaseEntity* getEntity(const edict_t* edict)
-{
- return edict == NULL ? NULL : (CBaseEntity*)edict->pvPrivateData;
-}
-
-string AvHNexus::getNetworkID(const edict_t* edict)
-{
- //TODO: resolve this!
- return "";
-}
-
-void AvHNexus::handleUnauthorizedJoinTeamAttempt(const edict_t* edict, const unsigned char team_index)
-{
- //TODO: teleport ready room player to spawn to prevent blocked doorway
-}
-
-void AvHNexus::performSpeedTest(void)
-{
- //TODO: check permission to do this before allowing it
- Nexus::testConnectionSpeed();
-}
-
-void AvHNexus::processResponses(void)
-{
- //TODO: do something with the responses as we consume them!
- Nexus::ClientID id;
- while((id = Nexus::hasHandleInfo()) != 0)
+ //note: we place this here so that we have the possibility of giving out AvHNetworkMessages.cpp
+ bool AvHNexus::send(entvars_t* const pev, const unsigned char* data, const unsigned int length)
{
- Nexus::getHandleInfo(id);
+ if( !pev ) { return false; }
+ MESSAGE_BEGIN( MSG_ONE, g_msgNexusBytes, NULL, pev );
+ for( int counter = 0; counter < length; counter++ )
+ { WRITE_BYTE(data[counter]); }
+ MESSAGE_END();
+ return true;
}
- while((id = Nexus::hasHistoryInfo()) != 0)
+
+ bool AvHNexus::recv(entvars_t* const pev, const char* data, const unsigned int length)
{
- Nexus::getHistoryInfo(id);
+ string base64_message(data,length);
+ byte_string message = BASE64Decode(base64_message);
+ Nexus::ClientID client = OFFSET(pev);
+ TunnelToClient::getInstance()->insertMessage(client,message);
+ return true;
}
- while(Nexus::hasErrorReport())
+
+ inline CBaseEntity* getEntity(const edict_t* edict)
{
- Nexus::getErrorReport();
+ return edict == NULL ? NULL : (CBaseEntity*)edict->pvPrivateData;
}
- while(Nexus::hasPerformanceData())
+
+ string AvHNexus::getNetworkID(const edict_t* edict)
{
- Nexus::getPerformanceData();
+ //TODO: resolve this!
+ return "";
}
-}
-void AvHNexus::setGeneratePerformanceData(const edict_t* edict, const bool generate)
-{
- //TODO: check permission to do this before allowing it
- Nexus::setGeneratePerformanceData(generate);
- CBaseEntity* player = getEntity(edict);
- if(player && AvHNexus::getGeneratePerformanceData())
+ void AvHNexus::handleUnauthorizedJoinTeamAttempt(const edict_t* edict, const unsigned char team_index)
{
- UTIL_SayText("Nexus Profiling is now ON", player);
+ //TODO: teleport ready room player to spawn to prevent blocked doorway
}
- else
+
+ void AvHNexus::performSpeedTest(void)
{
- UTIL_SayText("Nexus Profiling is now OFF", player);
+ //TODO: check permission to do this before allowing it
+ Nexus::testConnectionSpeed();
}
-}
-bool AvHNexus::getGeneratePerformanceData(void)
-{
- return Nexus::getGeneratePerformanceData();
-}
-
-bool AvHNexus::isRecordingGame(void)
-{
- return Nexus::isRecordingEvent();
-}
-
-void AvHNexus::cancelGame(void)
-{
- Nexus::reportEventCancelled();
-}
-
-void AvHNexus::finishGame(void)
-{
- Nexus::EventResultInfo info;
- Nexus::reportEventFinished(info);
-}
-
-void AvHNexus::startGame(void)
-{
- Nexus::EventInfo info;
- Nexus::reportEventStarted(info);
-}
-
-void AvHNexus::startup(void)
-{
- Nexus::setTunnelToClient(TunnelToClient::getInstance());
- Nexus::setProductName("Natural Selection-temp product");
- Nexus::connect(createServerInfo());
-}
-
-void AvHNexus::shutdown(void)
-{
- Nexus::disconnect();
-}
-
-Nexus::ServerInfo(createServerInfo())
-{
- Nexus::ServerInfo info;
- info.setName( string( CVAR_GET_STRING( "hostname" ) ) );
- info.setProduct( Nexus::getProductName() );
- return info;
-}
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Base 64 decoder
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-byte Base64DecodeTable[256] = {
- 0, 0, 0, 0, 0, 0, 0, 0, // 0- 7
- 0, 0, 0, 0, 0, 0, 0, 0, // 8- 15
- 0, 0, 0, 0, 0, 0, 0, 0, // 16- 23
- 0, 0, 0, 0, 0, 0, 0, 0, // 24- 31
- 0, 0, 0, 0, 0, 0, 0, 0, // 32- 39
- 0, 0, 0, 62, 0, 0, 0, 63, // 40- 47 ( 43 = '+', 47 = '/')
- 52, 53, 54, 55, 56, 57, 58, 59, // 48- 55 ( 48- 55 = 0-7)
- 60, 61, 0, 0, 0, 0, 0, 0, // 56- 63 ( 56- 57 = 8-9)
- 0, 0, 1, 2, 3, 4, 5, 6, // 64- 71 ( 65- 71 = A-G)
- 7, 8, 9, 10, 11, 12, 13, 14, // 72- 79 ( 72- 79 = H-O)
- 15, 16, 17, 18, 19, 20, 21, 22, // 80- 87 ( 80- 87 = P-W)
- 23, 24, 25, 0, 0, 0, 0, 0, // 88- 95 ( 88- 90 = X-Z)
- 0, 26, 27, 28, 29, 30, 31, 32, // 96 003 ( 97 003 = a-g)
- 33, 34, 35, 36, 37, 38, 39, 40, //104 011 (104-111 = h-o)
- 41, 42, 43, 44, 45, 46, 47, 48, //112 019 (112-119 = p-w)
- 49, 50, 51, 0, 0, 0, 0, 0, //120 027 (120-122 = x-z)
- 0, 0, 0, 0, 0, 0, 0, 0, //128 035
- 0, 0, 0, 0, 0, 0, 0, 0, //136 043
- 0, 0, 0, 0, 0, 0, 0, 0, //144 051
- 0, 0, 0, 0, 0, 0, 0, 0, //152 059
- 0, 0, 0, 0, 0, 0, 0, 0, //160 067
- 0, 0, 0, 0, 0, 0, 0, 0, //168 075
- 0, 0, 0, 0, 0, 0, 0, 0, //176 083
- 0, 0, 0, 0, 0, 0, 0, 0, //184 091
- 0, 0, 0, 0, 0, 0, 0, 0, //192 099
- 0, 0, 0, 0, 0, 0, 0, 0, //200-207
- 0, 0, 0, 0, 0, 0, 0, 0, //208-215
- 0, 0, 0, 0, 0, 0, 0, 0, //216-223
- 0, 0, 0, 0, 0, 0, 0, 0, //224-231
- 0, 0, 0, 0, 0, 0, 0, 0, //232-239
- 0, 0, 0, 0, 0, 0, 0, 0, //240-247
- 0, 0, 0, 0, 0, 0, 0, 0 //248-255
-};
-
-//debugged and working properly... do not disturb.
-byte_string BASE64Decode(const string& input)
-{
- byte_string output;
- const byte* data = (const byte*)input.c_str();
- size_t length = input.length();
- byte value, value2;
-
- while( length > 0 )
+ void AvHNexus::processResponses(void)
{
- value = Base64DecodeTable[data[0]];
- value2 = Base64DecodeTable[data[1]];
- value <<= 2;
- value2 &= 0x30; value2 >>= 4; value |= value2;
- output.push_back(value);
- if( data[2] != '=' )
+ //TODO: do something with the responses as we consume them!
+ Nexus::ClientID id;
+ while((id = Nexus::hasHandleInfo()) != 0)
{
- value = Base64DecodeTable[data[1]];
- value2 = Base64DecodeTable[data[2]];
- value &= 0x0F; value <<= 4;
- value2 &= 0x3C; value2 >>= 2; value |= value2;
- output.push_back(value);
+ Nexus::getHandleInfo(id);
}
- if( data[3] != '=' )
+ while((id = Nexus::hasHistoryInfo()) != 0)
{
- value = Base64DecodeTable[data[2]];
- value &= 0x03; value <<= 6;
- value |= Base64DecodeTable[data[3]];
- output.push_back(value);
+ Nexus::getHistoryInfo(id);
+ }
+ while(Nexus::hasErrorReport())
+ {
+ Nexus::getErrorReport();
+ }
+ while(Nexus::hasPerformanceData())
+ {
+ Nexus::getPerformanceData();
}
- data += 4; length -= 4;
}
- return output;
-}
\ No newline at end of file
+
+ void AvHNexus::setGeneratePerformanceData(const edict_t* edict, const bool generate)
+ {
+ //TODO: check permission to do this before allowing it
+ Nexus::setGeneratePerformanceData(generate);
+ CBaseEntity* player = getEntity(edict);
+ if(player && AvHNexus::getGeneratePerformanceData())
+ {
+ UTIL_SayText("Nexus Profiling is now ON", player);
+ }
+ else
+ {
+ UTIL_SayText("Nexus Profiling is now OFF", player);
+ }
+ }
+
+ bool AvHNexus::getGeneratePerformanceData(void)
+ {
+ return Nexus::getGeneratePerformanceData();
+ }
+
+ bool AvHNexus::isRecordingGame(void)
+ {
+ return Nexus::isRecordingEvent();
+ }
+
+ void AvHNexus::cancelGame(void)
+ {
+ Nexus::reportEventCancelled();
+ }
+
+ void AvHNexus::finishGame(void)
+ {
+ Nexus::EventResultInfo info;
+ Nexus::reportEventFinished(info);
+ }
+
+ void AvHNexus::startGame(void)
+ {
+ Nexus::EventInfo info;
+ Nexus::reportEventStarted(info);
+ }
+
+ void AvHNexus::startup(void)
+ {
+ Nexus::setTunnelToClient(TunnelToClient::getInstance());
+ Nexus::setProductName("Natural Selection-temp product");
+ Nexus::connect(createServerInfo());
+ }
+
+ void AvHNexus::shutdown(void)
+ {
+ Nexus::disconnect();
+ }
+
+ Nexus::ServerInfo(createServerInfo())
+ {
+ Nexus::ServerInfo info;
+ info.setName( string( CVAR_GET_STRING( "hostname" ) ) );
+ info.setProduct( Nexus::getProductName() );
+ return info;
+ }
+
+ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ // Base 64 decoder
+ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ byte Base64DecodeTable[256] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, // 0- 7
+ 0, 0, 0, 0, 0, 0, 0, 0, // 8- 15
+ 0, 0, 0, 0, 0, 0, 0, 0, // 16- 23
+ 0, 0, 0, 0, 0, 0, 0, 0, // 24- 31
+ 0, 0, 0, 0, 0, 0, 0, 0, // 32- 39
+ 0, 0, 0, 62, 0, 0, 0, 63, // 40- 47 ( 43 = '+', 47 = '/')
+ 52, 53, 54, 55, 56, 57, 58, 59, // 48- 55 ( 48- 55 = 0-7)
+ 60, 61, 0, 0, 0, 0, 0, 0, // 56- 63 ( 56- 57 = 8-9)
+ 0, 0, 1, 2, 3, 4, 5, 6, // 64- 71 ( 65- 71 = A-G)
+ 7, 8, 9, 10, 11, 12, 13, 14, // 72- 79 ( 72- 79 = H-O)
+ 15, 16, 17, 18, 19, 20, 21, 22, // 80- 87 ( 80- 87 = P-W)
+ 23, 24, 25, 0, 0, 0, 0, 0, // 88- 95 ( 88- 90 = X-Z)
+ 0, 26, 27, 28, 29, 30, 31, 32, // 96 003 ( 97 003 = a-g)
+ 33, 34, 35, 36, 37, 38, 39, 40, //104 011 (104-111 = h-o)
+ 41, 42, 43, 44, 45, 46, 47, 48, //112 019 (112-119 = p-w)
+ 49, 50, 51, 0, 0, 0, 0, 0, //120 027 (120-122 = x-z)
+ 0, 0, 0, 0, 0, 0, 0, 0, //128 035
+ 0, 0, 0, 0, 0, 0, 0, 0, //136 043
+ 0, 0, 0, 0, 0, 0, 0, 0, //144 051
+ 0, 0, 0, 0, 0, 0, 0, 0, //152 059
+ 0, 0, 0, 0, 0, 0, 0, 0, //160 067
+ 0, 0, 0, 0, 0, 0, 0, 0, //168 075
+ 0, 0, 0, 0, 0, 0, 0, 0, //176 083
+ 0, 0, 0, 0, 0, 0, 0, 0, //184 091
+ 0, 0, 0, 0, 0, 0, 0, 0, //192 099
+ 0, 0, 0, 0, 0, 0, 0, 0, //200-207
+ 0, 0, 0, 0, 0, 0, 0, 0, //208-215
+ 0, 0, 0, 0, 0, 0, 0, 0, //216-223
+ 0, 0, 0, 0, 0, 0, 0, 0, //224-231
+ 0, 0, 0, 0, 0, 0, 0, 0, //232-239
+ 0, 0, 0, 0, 0, 0, 0, 0, //240-247
+ 0, 0, 0, 0, 0, 0, 0, 0 //248-255
+ };
+
+ //debugged and working properly... do not disturb.
+ byte_string BASE64Decode(const string& input)
+ {
+ byte_string output;
+ const byte* data = (const byte*)input.c_str();
+ size_t length = input.length();
+ byte value, value2;
+
+ while( length > 0 )
+ {
+ value = Base64DecodeTable[data[0]];
+ value2 = Base64DecodeTable[data[1]];
+ value <<= 2;
+ value2 &= 0x30; value2 >>= 4; value |= value2;
+ output.push_back(value);
+ if( data[2] != '=' )
+ {
+ value = Base64DecodeTable[data[1]];
+ value2 = Base64DecodeTable[data[2]];
+ value &= 0x0F; value <<= 4;
+ value2 &= 0x3C; value2 >>= 2; value |= value2;
+ output.push_back(value);
+ }
+ if( data[3] != '=' )
+ {
+ value = Base64DecodeTable[data[2]];
+ value &= 0x03; value <<= 6;
+ value |= Base64DecodeTable[data[3]];
+ output.push_back(value);
+ }
+ data += 4; length -= 4;
+ }
+ return output;
+ }
+#endif
diff --git a/main/source/util/Balance.h b/main/source/util/Balance.h
index e28ab08..288e73a 100644
--- a/main/source/util/Balance.h
+++ b/main/source/util/Balance.h
@@ -14,42 +14,6 @@
#include
#include "../Balance.txt" //default balancing source - this used to be ../Balance.txt
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// BALANCE_VAR(x) macro - the heart of the balance system, ties value
-// to default balance source if PLAYTEST_BUILD is enabled, uses
-// hardcoded value otherwise. Place the name of the varaible #define
-// in Balance.txt as the value in the macro.
-//
-// BALANCE_LISTENER(x) macro - for registering global
-// BalanceChangeListeners (see below), reverts to no operation
-// if AVH_PLAYTEST_BUILD isn't enabled.
-//
-// BALANCE_FIELD_LISTENER(x,y) macro - for registering field-specific
-// BalanceChangeListeners, reverts to no operation if
-// BALANCE_ENABLED isn't defined
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-#ifdef BALANCE_ENABLED //use Balance.txt values on server, no-source/explicitly set values for client
- #ifdef SERVER
- #define BALANCE_DEFNAME BalanceVarContainerFactory::getDefaultFilename()
- #else
- #define BALANCE_DEFNAME ""
- #endif
-
- inline void BALANCE_LISTENER(const BalanceChangeListener* object) { BalanceValueContainerFactory::get(BALANCE_DEFNAME)->addListener(object); }
- inline void BALANCE_FIELD_LISTENER(const BalanceChangeListener* object, const char* field) { BalanceValueContainerFactory::get(BALANCE_DEFNAME)->addListener(object,field); }
-
- #define BALANCE_VAR(name) GetBalanceVar(#name,name) //requires macro for string-izing of name
- inline int GetBalanceVar(const char* name, const int value) { BalanceValueContainerFactory::get(BALANCE_DEFNAME)->get(name,value); }
- inline float GetBalanceVar(const char* name, const float value) { BalanceValueContainerFactory::get(BALANCE_DEFNAME)->get(name,value); }
- inline float GetBalanceVar(const char* name, const double value) { BalanceValueContainerFactory::get(BALANCE_DEFNAME)->get(name,(float)value); }
- inline std::string GetBalanceVar(const char* name, const char* value) { BalanceValueContainerFactory::get(BALANCE_DEFNAME)->get(name,value); }
-#else
- #define BALANCE_VAR(name) name //hardcodes the value at compile time
- #define BALANCE_LISTENER(object)
- #define BALANCE_FIELD_LISTENER(object,name)
-#endif //BALANCE_ENABLED
-
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// BalanceValueContainerFactory -- facade that creates, stores, and
// maintains BalanceValueContainer objects. Multiple calls with the
@@ -209,4 +173,40 @@ protected:
BalanceValueContainer(void);
};
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// BALANCE_VAR(x) macro - the heart of the balance system, ties value
+// to default balance source if PLAYTEST_BUILD is enabled, uses
+// hardcoded value otherwise. Place the name of the varaible #define
+// in Balance.txt as the value in the macro.
+//
+// BALANCE_LISTENER(x) macro - for registering global
+// BalanceChangeListeners (see below), reverts to no operation
+// if AVH_PLAYTEST_BUILD isn't enabled.
+//
+// BALANCE_FIELD_LISTENER(x,y) macro - for registering field-specific
+// BalanceChangeListeners, reverts to no operation if
+// BALANCE_ENABLED isn't defined
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+#ifdef BALANCE_ENABLED //use Balance.txt values on server, no-source/explicitly set values for client
+ #ifdef SERVER
+ #define BALANCE_DEFNAME BalanceValueContainerFactory::getDefaultFilename()
+ #else
+ #define BALANCE_DEFNAME ""
+ #endif
+
+ inline void BALANCE_LISTENER(const BalanceChangeListener* object) { BalanceValueContainerFactory::get(BALANCE_DEFNAME)->addListener(object); }
+ inline void BALANCE_FIELD_LISTENER(const BalanceChangeListener* object, const char* field) { BalanceValueContainerFactory::get(BALANCE_DEFNAME)->addListener(field,object); }
+
+ #define BALANCE_VAR(name) GetBalanceVar(#name,name) //requires macro for string-izing of name
+ inline int GetBalanceVar(const char* name, const int value) { return BalanceValueContainerFactory::get(BALANCE_DEFNAME)->get(name,value); }
+ inline float GetBalanceVar(const char* name, const float value) { return BalanceValueContainerFactory::get(BALANCE_DEFNAME)->get(name,value); }
+ inline float GetBalanceVar(const char* name, const double value) { return BalanceValueContainerFactory::get(BALANCE_DEFNAME)->get(name,(float)value); }
+ inline std::string GetBalanceVar(const char* name, const char* value) { return BalanceValueContainerFactory::get(BALANCE_DEFNAME)->get(name,value); }
+#else
+ #define BALANCE_VAR(name) name //hardcodes the value at compile time
+ #define BALANCE_LISTENER(object)
+ #define BALANCE_FIELD_LISTENER(object,name)
+#endif //BALANCE_ENABLED
+
#endif //BALANCE_H
\ No newline at end of file