| 
									
										
										
										
											2024-09-16 17:09:36 +08:00
										 |  |  | /* | 
					
						
							|  |  |  | 文件名:BaseTool_Class.nut | 
					
						
							|  |  |  | 路径:Base/_Tool/BaseTool_Class.nut | 
					
						
							|  |  |  | 创建日期:2024-08-06	23:49 | 
					
						
							|  |  |  | 文件用途:基础工具类 | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | //Json类 | 
					
						
							|  |  |  | class Json { | 
					
						
							|  |  |  |     function Encode(Table) { | 
					
						
							|  |  |  |         local Size = Table.len(); | 
					
						
							|  |  |  |         local Pos = 0; | 
					
						
							|  |  |  |         local Str = "{"; | 
					
						
							|  |  |  |         foreach(Key, Value in Table) { | 
					
						
							|  |  |  |             ++Pos; | 
					
						
							|  |  |  |             Str += "\""; | 
					
						
							|  |  |  |             Str += Key.tostring(); | 
					
						
							|  |  |  |             Str += "\""; | 
					
						
							|  |  |  |             Str += ":"; | 
					
						
							|  |  |  |             if (typeof(Value) == "string") { | 
					
						
							|  |  |  |                 Str += "\""; | 
					
						
							|  |  |  |                 Str += Value; | 
					
						
							|  |  |  |                 Str += "\""; | 
					
						
							|  |  |  |             } else if (typeof(Value) == "table") { | 
					
						
							|  |  |  |                 Str += Json.Encode(Value); | 
					
						
							|  |  |  |             } else if (typeof(Value) == "array") { | 
					
						
							|  |  |  |                 Str += "["; | 
					
						
							|  |  |  |                 foreach(ArrObj in Value) { | 
					
						
							|  |  |  |                     if (typeof(ArrObj) == "table") Str += Json.Encode(Value); | 
					
						
							|  |  |  |                     else { | 
					
						
							|  |  |  |                         Str += ArrObj; | 
					
						
							|  |  |  |                         Str += ","; | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 Str = Str.slice(0, Str.len() - 1); | 
					
						
							|  |  |  |                 Str += "]"; | 
					
						
							|  |  |  |             } else Str += Value; | 
					
						
							|  |  |  |             if (Pos != Size) Str += ","; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         Str += "}"; | 
					
						
							|  |  |  |         return Str; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function Decode(Str) { | 
					
						
							| 
									
										
										
										
											2024-09-29 16:52:10 +08:00
										 |  |  |         // Str = L_sq_DecondeJson(Str); | 
					
						
							|  |  |  |         // local Str = "local _M = " + Str + ";\n return _M;\n"; | 
					
						
							|  |  |  |         // local Func = compilestring(Str); | 
					
						
							|  |  |  |         // return Func(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         local JsonObj = JSONParser(); | 
					
						
							|  |  |  |         return JsonObj.parse(Str); | 
					
						
							| 
									
										
										
										
											2024-09-16 17:09:36 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | //Key 键盘按键类 | 
					
						
							|  |  |  | class KeyPress { | 
					
						
							|  |  |  |     function KeyDown(obj, KeyValue) { | 
					
						
							|  |  |  |         local KeyEvent = obj.getVar(KeyValue.tostring()); //声明储存器 | 
					
						
							|  |  |  |         KeyEvent.clear_vector(); //清空储存器的向量位 | 
					
						
							|  |  |  |         if (sq_IsKeyDown(KeyValue, ENUM_SUBKEY_TYPE_ALL) && KeyEvent.getInt(0) == 0) { | 
					
						
							|  |  |  |             KeyEvent.setInt(0, 1); | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function KeyUp(obj, KeyValue) { | 
					
						
							|  |  |  |         local KeyEvent = obj.getVar(KeyValue.tostring()); //声明储存器 | 
					
						
							|  |  |  |         if (sq_IsKeyUp(KeyValue, ENUM_SUBKEY_TYPE_ALL)) { | 
					
						
							|  |  |  |             KeyEvent.setInt(0, 0); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function isKeyPress(KeyValue) { | 
					
						
							|  |  |  |         local obj = sq_getMyCharacter(); | 
					
						
							|  |  |  |         if (KeyPress.KeyDown(obj, KeyValue)) { | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         KeyPress.KeyUp(obj, KeyValue); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | //Key 键盘按键类 | 
					
						
							|  |  |  | class KeyPressNB { | 
					
						
							|  |  |  |     function KeyDown(obj, KeyValue, VarKey) { | 
					
						
							|  |  |  |         local KeyEvent = obj.getVar(VarKey); //声明储存器 | 
					
						
							|  |  |  |         KeyEvent.clear_vector(); //清空储存器的向量位 | 
					
						
							|  |  |  |         if (sq_IsKeyDown(KeyValue, ENUM_SUBKEY_TYPE_ALL) && KeyEvent.getInt(0) == 0) { | 
					
						
							|  |  |  |             KeyEvent.setInt(0, 1); | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function KeyUp(obj, KeyValue, VarKey) { | 
					
						
							|  |  |  |         local KeyEvent = obj.getVar(VarKey); //声明储存器 | 
					
						
							|  |  |  |         if (sq_IsKeyUp(KeyValue, ENUM_SUBKEY_TYPE_ALL)) { | 
					
						
							|  |  |  |             KeyEvent.setInt(0, 0); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function isKeyPress(KeyValue, VarKey) { | 
					
						
							|  |  |  |         local obj = sq_getMyCharacter(); | 
					
						
							|  |  |  |         obj = sq_GetCNRDObjectToActiveObject(obj); | 
					
						
							|  |  |  |         if (KeyPressNB.KeyDown(obj, KeyValue, VarKey)) { | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         KeyPressNB.KeyUp(obj, KeyValue, VarKey); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | //基础工具类 | 
					
						
							|  |  |  | class Rindro_BaseToolClass { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function SendPack(T) { | 
					
						
							|  |  |  |         local str = Json.Encode(T); | 
					
						
							|  |  |  |         L_sq_SendPackType(130); | 
					
						
							|  |  |  |         L_sq_SendPackWChar(str); | 
					
						
							|  |  |  |         L_sq_SendPack(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function SendPackEx(T) { | 
					
						
							|  |  |  |         local str = L_sq_EncondeJson(T); | 
					
						
							|  |  |  |         L_sq_SendPackType(130); | 
					
						
							|  |  |  |         L_sq_SendPackWChar(str); | 
					
						
							|  |  |  |         L_sq_SendPack(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     //绘制简易静态Ani					// obj --  ani路径  --  X   --  Y  --  第几帧  --  ani名字 | 
					
						
							|  |  |  |     function T_DrawStayAni(obj, aniFileName, x, y, index, aniname) { | 
					
						
							|  |  |  |         local SelectAni = obj.getVar().GetAnimationMap(aniname, aniFileName); | 
					
						
							|  |  |  |         //sq_AnimationProc(SelectAni); | 
					
						
							|  |  |  |         sq_DrawSpecificFrame(SelectAni, x, y, false, index, false, 1.0); | 
					
						
							|  |  |  |         return SelectAni; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     //绘制简易静态Ani					// obj --  ani路径  --  X   --  Y  --  第几帧  --  ani名字 | 
					
						
							|  |  |  |     function T_DrawStayAniRate(obj, aniFileName, x, y, index, aniname, rate) { | 
					
						
							|  |  |  |         local SelectAni = obj.getVar().GetAnimationMap(aniname, aniFileName); | 
					
						
							|  |  |  |         SelectAni.setImageRateFromOriginal(rate, rate); | 
					
						
							|  |  |  |         //sq_AnimationProc(SelectAni); | 
					
						
							|  |  |  |         sq_DrawSpecificFrame(SelectAni, x, y, false, index, false, 1.0); | 
					
						
							|  |  |  |         return SelectAni; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     //绘制简易动态Ani					// obj --  ani路径  --  X   --  Y  --  ani名字 | 
					
						
							|  |  |  |     function T_DrawDynamicAni(obj, aniFileName, x, y, aniname) { | 
					
						
							|  |  |  |         local ani = obj.getVar().GetAnimationMap(aniname, aniFileName); | 
					
						
							|  |  |  |         sq_AnimationProc(ani); | 
					
						
							|  |  |  |         sq_drawCurrentFrame(ani, x, y, true); | 
					
						
							|  |  |  |         return ani; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     //初始化根表成员 | 
					
						
							|  |  |  |     function InitClass(Name) { | 
					
						
							|  |  |  |         local RootTab = getroottable(); | 
					
						
							|  |  |  |         if (RootTab.rawin(Name) == true) { | 
					
						
							|  |  |  |             RootTab.rawdelete(Name); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     //获取交互Npc名称 | 
					
						
							|  |  |  |     function GetEachNpcId() { | 
					
						
							|  |  |  |         local OneAddress = L_sq_RA(0x1ADE0E0); | 
					
						
							|  |  |  |         if (OneAddress) { | 
					
						
							|  |  |  |             local TowAddress = L_sq_RA(OneAddress + 8); | 
					
						
							|  |  |  |             if (TowAddress) { | 
					
						
							|  |  |  |                 local Id = L_sq_RA(TowAddress + 0x210); | 
					
						
							|  |  |  |                 return Id; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return null; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | //获取文字绘制长度 | 
					
						
							|  |  |  | class LenheartTextClass { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function GetStringLength(str) { | 
					
						
							|  |  |  |         return L_sq_GetStringDrawLength(str); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | class MemoryTool { | 
					
						
							|  |  |  |     //给指定地址写入字节数组 | 
					
						
							|  |  |  |     function WirteByteArr(Address, ByteArr) { | 
					
						
							|  |  |  |         for (local i = 0; i< ByteArr.len(); i++) { | 
					
						
							|  |  |  |             L_sq_WAB(Address + i, ByteArr[i]); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     //解密读取内存地址的数据 | 
					
						
							|  |  |  |     function DecodeMemoryData(Address) { | 
					
						
							|  |  |  |         local nEax, nEcx8, nEsi, nEdx, nTmp; | 
					
						
							|  |  |  |         nEax = L_sq_RA(Address); | 
					
						
							|  |  |  |         if (nEax == -1) return nEax; | 
					
						
							|  |  |  |         nEcx8 = L_sq_RA(Address + 8); | 
					
						
							|  |  |  |         if (nEcx8 == -1) return nEcx8; | 
					
						
							|  |  |  |         nEsi = L_sq_RA(0x1AF8D78); | 
					
						
							|  |  |  |         nEdx = nEax >> 16; | 
					
						
							|  |  |  |         nTmp = (nEdx << 2) + nEsi + 36; | 
					
						
							|  |  |  |         nEdx = L_sq_RA(nTmp); | 
					
						
							|  |  |  |         if (nEdx == -1) return nEdx; | 
					
						
							|  |  |  |         nEax = nEax & 65535; | 
					
						
							|  |  |  |         nTmp = (nEax << 2) + nEdx + 8468; | 
					
						
							|  |  |  |         nEax = L_sq_RA(nTmp); | 
					
						
							|  |  |  |         if (nEax == -1) return nEax; | 
					
						
							|  |  |  |         nEdx = nEax & 0xFFFF; | 
					
						
							|  |  |  |         nEsi = nEdx << 16; | 
					
						
							|  |  |  |         nEsi = nEsi | nEdx; | 
					
						
							|  |  |  |         nEax = nEsi ^ nEcx8; | 
					
						
							|  |  |  |         return nEax; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     //加密写入内存地址数据 | 
					
						
							|  |  |  |     function EncodeMemoryData() { | 
					
						
							|  |  |  |         local JEdi, JEcx, JEax, JEsi, JEdx, JSs; | 
					
						
							|  |  |  |         JEcx = AddreSs; | 
					
						
							|  |  |  |         JEax = L_sq_RA(0x1AF8DB8); | 
					
						
							|  |  |  |         JEax = JEax + 1; | 
					
						
							|  |  |  |         L_sq_WA(0x1AF8DB8, JEax); | 
					
						
							|  |  |  |         JEdx = JEax; | 
					
						
							|  |  |  |         JEdx = JEdx >> 8; | 
					
						
							|  |  |  |         JEdx = JEdx << 24; | 
					
						
							|  |  |  |         JEdx = JEdx >> 24; | 
					
						
							|  |  |  |         JEdx = L_sq_RA(JEdx * 2 + 0x1843F58); | 
					
						
							|  |  |  |         JEdx = JEdx & 0xFFFF; | 
					
						
							|  |  |  |         JEax = JEax << 24; | 
					
						
							|  |  |  |         JEax = JEax >> 24; | 
					
						
							|  |  |  |         JSs = L_sq_RA(JEax * 2 + 0x1844158); | 
					
						
							|  |  |  |         JSs = JSs & 0xFFFF; | 
					
						
							|  |  |  |         JEdx = JEdx ^ JSs; | 
					
						
							|  |  |  |         JEax = JEdx; | 
					
						
							|  |  |  |         JEax = JEax & 0xFFFF; | 
					
						
							|  |  |  |         JEsi = Data; | 
					
						
							|  |  |  |         JEdx = JEsi >> 16; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         JSs = JEsi & 0xFFFF; | 
					
						
							|  |  |  |         JEdx = JEdx + JSs; | 
					
						
							|  |  |  |         JEdx = JEdx ^ JEax; | 
					
						
							|  |  |  |         JEdi = JEdx; | 
					
						
							|  |  |  |         JEdx = JEax; | 
					
						
							|  |  |  |         JEax = JEax << 16; | 
					
						
							|  |  |  |         JEax = JEax + JEdx; | 
					
						
							|  |  |  |         JEsi = Data; | 
					
						
							|  |  |  |         JEax = JEax ^ JEsi; | 
					
						
							|  |  |  |         JEsi = AddreSs + 8; | 
					
						
							|  |  |  |         L_sq_WA(JEsi, JEax); | 
					
						
							|  |  |  |         JEax = L_sq_RA(AddreSs); | 
					
						
							|  |  |  |         JEsi = L_sq_RA(0x1AF8D78); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         JEcx = JEdi; | 
					
						
							|  |  |  |         JEcx = JEcx << 16; | 
					
						
							|  |  |  |         JEcx = JEcx + JEdx; | 
					
						
							|  |  |  |         JEdx = JEax; | 
					
						
							|  |  |  |         JEdx = JEdx >> 16; | 
					
						
							|  |  |  |         JEdx = L_sq_RA(JEsi + JEdx * 4 + 36); | 
					
						
							|  |  |  |         JEax = JEax & 0xFFFF; | 
					
						
							|  |  |  |         L_sq_WA(JEdx + JEax * 4 + 8468, JEcx); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function DecodeMemoryDataF(Address) { | 
					
						
							|  |  |  |         local Value = MemoryTool.DecodeMemoryData(Address); | 
					
						
							|  |  |  |         local Bl = blob(); | 
					
						
							|  |  |  |         Bl.writen(Value, 'i'); | 
					
						
							|  |  |  |         Bl.seek(0); | 
					
						
							|  |  |  |         return Bl.readn('f'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function ReadFloat(Address) { | 
					
						
							|  |  |  |         local Arr = []; | 
					
						
							|  |  |  |         for (local i = 0; i< 4; i++) { | 
					
						
							|  |  |  |             Arr.append(L_sq_RAB(Address + i)); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         // local Value = L_sq_RAB(Address); | 
					
						
							|  |  |  |         // print(Value); | 
					
						
							|  |  |  |         local Bl = blob(); | 
					
						
							|  |  |  |         foreach(intvalue in Arr) { | 
					
						
							|  |  |  |             Bl.writen(intvalue, 'c'); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         // Bl.writen(Value, 'i'); | 
					
						
							|  |  |  |         Bl.seek(0); | 
					
						
							|  |  |  |         return Bl.readn('f'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |