You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

434 lines
10 KiB

  1. -- 是否显示解析协议的具体信息
  2. local showNetLog = true;
  3. VT_None = 0;
  4. -- bool,1字节
  5. VT_Bool = 1;
  6. -- 无符号uchar,1字节,对应java的byte
  7. VT_UChar = 2;
  8. -- 有符号char,1字节,对应java的byte
  9. VT_Char = 3;
  10. -- 有符号short,2字节
  11. VT_Short = 4;
  12. -- 无符号ushort,2字节
  13. VT_UShort = 5;
  14. -- 有符号int,4字节
  15. VT_Int = 6;
  16. -- 无符号uint,4字节
  17. VT_UInt = 7;
  18. -- 浮点数,4字节
  19. VT_Float = 8;
  20. -- 长整形,int64,8字节,对应java的long
  21. VT_LLong = 9;
  22. -- 字符串,使用UTF8编码,先保存2字节长度,再保存字符串数据
  23. VT_String = 10;
  24. -- 双精度浮点数
  25. VT_Double = 11;
  26. -- 二进制数据,先保存4个字节长度,再保存数据
  27. VT_Buffer = 12;
  28. VT_Byte = VT_Char;
  29. VT_Long = VT_LLong;
  30. -- 保存所有简单类型
  31. local gSimpleNetVarType = {}
  32. for i = 1 , 12 do
  33. gSimpleNetVarType[i] = cc.SimpleNetVar:create(i);
  34. gSimpleNetVarType[i]:retain();
  35. autoGC(gSimpleNetVarType[i]);
  36. end
  37. -- 保存所有全局类
  38. local gNetClassType = {}
  39. -- 获取网络数据类型
  40. function getVarType(t)
  41. if type(t) == "number" then
  42. local simpleType = gSimpleNetVarType[t];
  43. assert(simpleType);
  44. return simpleType;
  45. else
  46. assert(t);
  47. return t;
  48. end
  49. end
  50. local newBindableArray = require("luaScript.Protocol.BindableArray")
  51. local function tableNewHook(tab , cls)
  52. local ret = newBindableArray(tab);
  53. rawset(ret , "NetVar" , cls);
  54. return ret;
  55. end
  56. local function tableReadHook(tab , cls)
  57. local ret = newBindableArray(tab);
  58. rawset(ret , "NetVar" , cls);
  59. return ret;
  60. end
  61. local function tableWriteHook(tab , cls)
  62. return rawget(tab , "Datas");
  63. end
  64. -- Map类型
  65. function VT_Map(keyType , valueType)
  66. local var = cc.MapNetVar:create(getVarType(keyType) , getVarType(valueType));
  67. var:setNewHookFunc(tableNewHook);
  68. var:setReadHookFunc(tableReadHook);
  69. var:setWriteHookFunc(tableWriteHook);
  70. return var;
  71. end
  72. -- Vector类型
  73. function VT_Vector(valueType)
  74. local var = cc.VectorNetVar:create(getVarType(valueType));
  75. var:setNewHookFunc(tableNewHook);
  76. var:setReadHookFunc(tableReadHook);
  77. var:setWriteHookFunc(tableWriteHook);
  78. return var;
  79. end
  80. -- Vector类型
  81. function VT_VectorToSet(valueType , defaultValue)
  82. local var = cc.VectorToSetNetVar:create(getVarType(valueType) , defaultValue);
  83. var:setNewHookFunc(tableNewHook);
  84. var:setReadHookFunc(tableReadHook);
  85. var:setWriteHookFunc(tableWriteHook);
  86. return var;
  87. end
  88. -- Vector类型
  89. function VT_VectorToMap(valueType , mapKeyName)
  90. assert(type(mapKeyName) == "string");
  91. local var = cc.VectorToMapNetVar:create(getVarType(valueType) , mapKeyName);
  92. var:setNewHookFunc(tableNewHook);
  93. var:setReadHookFunc(tableReadHook);
  94. var:setWriteHookFunc(tableWriteHook);
  95. return var;
  96. end
  97. -- 由用户决定读写函数
  98. function VT_Custom(name , newFunc , readFunc , writeFunc)
  99. assert(type(name) == "string" and type(newFunc) == "function" and type(readFunc) == "function" and type(writeFunc) == "function");
  100. return cc.CustomNetVar:create(name , newFunc , readFunc , writeFunc);
  101. end
  102. function VT_CustomVectorToMap(valueType , mapKeyName)
  103. assert(type(mapKeyName) == "string");
  104. local var = cc.CustomToMapNetVar:create(getVarType(valueType), mapKeyName);
  105. var:setNewHookFunc(tableNewHook);
  106. var:setReadHookFunc(tableReadHook);
  107. var:setWriteHookFunc(tableWriteHook);
  108. return var;
  109. end
  110. -- 定义一个枚举
  111. function VT_Enum(name , valueType , values)
  112. assert(type(name) == "string" and type(values) == "table");
  113. local enumVar = cc.EnumNetVar:create(name , getVarType(valueType));
  114. for i , v in pairs(values) do
  115. enumVar:addValue(i , v);
  116. end
  117. return enumVar;
  118. end
  119. -- 属性ID
  120. function VT_PropertyID(classTable)
  121. assert(tolua.type(classTable) == "cc.NetClass");
  122. return cc.PropertyIdNetVar:create(classTable);
  123. end
  124. -- 属性,需要传一个类的名字进来,属性最终序列化会变成一个属性ID+属性值(根据不同属性长度会不同)
  125. function VT_Property(classTable)
  126. assert(tolua.type(classTable) == "cc.NetClass");
  127. return cc.PropertyNetVar:create(classTable);
  128. end
  129. local function VT_MapPropertytableReadHook(tab , cls)
  130. local ret = newBindableArray(tab);
  131. rawset(ret , "NetVar" , cls);
  132. return ret;
  133. end
  134. -- 属性映射表类型
  135. function VT_MapProperty(classTable)
  136. assert(tolua.type(classTable) == "cc.NetClass");
  137. local var = cc.MapPropertyNetVar:create(classTable);
  138. var:setNewHookFunc(tableNewHook);
  139. var:setReadHookFunc(VT_MapPropertytableReadHook);
  140. var:setWriteHookFunc(tableWriteHook);
  141. return var;
  142. end
  143. local RemainTime = require("luaScript.Protocol.RemainTime")
  144. function VT_RemainTime(numberType, scaler, onTimeOver)
  145. local numberNetVar = getVarType(numberType);
  146. local function newRemainTime()
  147. return RemainTime:new();
  148. end
  149. local function newFunc(defaultValue)
  150. local instance = newRemainTime();
  151. if type(defaultValue) == "number" then
  152. instance:setRemainTime(defaultValue);
  153. end
  154. return instance;
  155. end
  156. local function readFunc(stream)
  157. local remainTime = NetStream.readNetVar(numberNetVar , stream)
  158. local instance = newRemainTime();
  159. instance:setRemainTime(remainTime / scaler);
  160. return instance
  161. end
  162. local function writeFunc(value , stream)
  163. NetStream.writeNetVar(numberNetVar , stream , value.RemainTime * scaler)
  164. end
  165. return VT_Custom("VT_RemainTime" , newFunc , readFunc , writeFunc);
  166. end
  167. -- 从NetStream解析出一个类
  168. function cc.NetClass:tryRead(stream)
  169. local result;
  170. local errorMessage;
  171. function readIt()
  172. cc.NetVar:setLogEnabled(showNetLog);
  173. result = NetStream.readNetVar(self , stream);
  174. end
  175. function onError(msg)
  176. errorMessage = msg;
  177. print("读取数据时发生了错误:" , msg);
  178. cc.NetVar:setLogEnabled(showNetLog);
  179. end
  180. xpcall(readIt, onError)
  181. return result;
  182. end
  183. -- 从NetStream解析出一个类
  184. function cc.NetClass:read(stream)
  185. local result;
  186. local errorMessage;
  187. function readIt()
  188. cc.NetVar:setLogEnabled(showNetLog);
  189. result = NetStream.readNetVar(self , stream);
  190. end
  191. function onError(msg)
  192. errorMessage = msg;
  193. cc.NetVar:setLogEnabled(showNetLog);
  194. print("读取数据时发生了错误,尝试以详细输出方式读取:" , msg);
  195. NetStream.reset(stream);
  196. xpcall(readIt,
  197. function(msg)
  198. cc.NetVar:setLogEnabled(showNetLog);
  199. print(msg)
  200. end
  201. )
  202. cc.NetVar:setLogEnabled(showNetLog);
  203. end
  204. xpcall(readIt, onError)
  205. cc.NetVar:setLogEnabled(showNetLog);
  206. --readIt();
  207. if errorMessage then
  208. error(errorMessage);
  209. end
  210. return result;
  211. end
  212. -- 创建类实例
  213. function cc.NetClass:new()
  214. local object = NetStream.newNetVar(self);
  215. return object;
  216. end
  217. -- 把类实例写入到stream
  218. function cc.NetClass:write(stream , object)
  219. NetStream.writeNetVar(self , stream , object);
  220. end
  221. -- 把类实例发送到服务器
  222. function cc.NetClass:send(object , moduleID , commandID, net)
  223. local stream = NetStream.new();
  224. self:write(stream , object);
  225. net:send(moduleID , commandID , stream);
  226. NetStream.delete(stream);
  227. end
  228. -- 保存到字符串
  229. function cc.NetClass:saveToString(object)
  230. local stream = NetStream.new();
  231. self:write(stream , object);
  232. local data = NetStream.getWriteData(stream);
  233. NetStream.delete(stream);
  234. return data;
  235. end
  236. -- 从字符串载入类
  237. function cc.NetClass:loadFromString(stringData)
  238. local stream = NetStream.new(stringData);
  239. local responseInfo = self:read(stream);
  240. NetStream.delete(stream);
  241. return responseInfo;
  242. end
  243. -- 保存到文件
  244. function cc.NetClass:saveToFile(object , filename)
  245. local stream = NetStream.new();
  246. self:write(stream , object);
  247. local data = NetStream.getWriteData(stream);
  248. local f = io.open(filename , "wb");
  249. if f then
  250. f:write(data);
  251. f:close();
  252. end
  253. NetStream.delete(stream);
  254. return data;
  255. end
  256. -- 从文件载入类
  257. function cc.NetClass:loadFromFile(filename)
  258. local f , err = io.open(filename , "rb");
  259. if not f then
  260. return f , err;
  261. end
  262. local stringData = f:read("*a");
  263. f:close();
  264. local stream = NetStream.new(stringData);
  265. local responseInfo = self:read(stream);
  266. NetStream.delete(stream);
  267. return responseInfo;
  268. end
  269. -- 克隆一份
  270. function cc.NetClass:clone(object)
  271. assert(object);
  272. local stream = NetStream.new();
  273. self:write(stream , object);
  274. local responseInfo = self:read(stream);
  275. NetStream.delete(stream);
  276. return responseInfo;
  277. end
  278. -- 定义一个成员变量
  279. function defVar(name , valueType , defaultValue , propId , minVersion)
  280. return cc.MemberVar:create(name , getVarType(valueType) , propId or -1 , defaultValue , true , minVersion or 0);
  281. end
  282. -- 定义一个本地成员变量(不序列化到网络)
  283. function localVar(name , valueType , defaultValue , propId)
  284. return cc.MemberVar:create(name , getVarType(valueType) , propId or -1 , defaultValue , false , 0);
  285. end
  286. local function classNewHook(tab , cls)
  287. if not cls or type(cls) ~= "userdata" then
  288. log(table.tostring(tab))
  289. end
  290. log(type(cls))
  291. local ret = newBindableArray(tab);
  292. rawset(ret , "NetVar" , cls);
  293. local onNew = cls.onNew;
  294. if onNew then
  295. onNew(cls , ret);
  296. end
  297. return ret;
  298. end
  299. local function classReadHook(tab , cls)
  300. local ret = newBindableArray(tab);
  301. rawset(ret , "NetVar" , cls);
  302. local onRead = cls.onRead;
  303. if onRead then
  304. onRead(cls , ret);
  305. end
  306. return ret;
  307. end
  308. local function classWriteHook(tab , cls)
  309. local onWrite = cls.onWrite;
  310. if onWrite then
  311. onWrite(cls , tab);
  312. end
  313. return rawget(tab , "Datas");
  314. end
  315. -- 定义一个类
  316. function defClass(name , ...)
  317. local arg = {...};
  318. local cls = cc.NetClass:create(name);
  319. cls:setNewHookFunc(classNewHook);
  320. cls:setReadHookFunc(classReadHook);
  321. cls:setWriteHookFunc(classWriteHook);
  322. for i , v in ipairs(arg) do
  323. cls:addMemberVar(v)
  324. end
  325. if gNetClassType then
  326. print(string.format("the class named [%s] is exist",name))
  327. end
  328. gNetClassType[name] = cls;
  329. local propByIds = {};
  330. local propByNames = {};
  331. -- 根据属性ID保存所有属性
  332. for i , v in ipairs(arg) do
  333. propByIds[v:getPropId()] = v;
  334. propByNames[v:getName()] = v;
  335. end
  336. -- 根据属性ID获取属性名
  337. function cls:getPropName(id)
  338. local prop = propByIds[id];
  339. if prop then
  340. return prop:getName();
  341. else
  342. return nil;
  343. end
  344. end
  345. -- 根据属性ID获取属性名
  346. function cls:getPropId(name)
  347. local prop = propByNames[name];
  348. if prop then
  349. return prop:getPropId();
  350. else
  351. return nil;
  352. end
  353. end
  354. -- 根据属性ID设置一个值
  355. function cls:set(object , id , value)
  356. object[self:getPropName(id)] = value;
  357. end
  358. -- 根据属性ID获取一个值
  359. function cls:get(object , id)
  360. return object[self:getPropName(id)];
  361. end
  362. -- 根据属性ID增加一个值
  363. function cls:add(object , id , value)
  364. local name = self:getPropName(id);
  365. object[name] = object[name] + value;
  366. end
  367. cls:retain();
  368. autoGC(cls);
  369. -- _G[name] = cls;
  370. return cls;
  371. end