// function sq_GetIntData(obj, SkillId, Idx) { // local ret = L_sq_GetIntData(obj, SkillId, Idx); // return ret + HookIntData(obj, SkillId, Idx); // } // function sq_getIntData(obj, SkillId, Idx) { // local ret = L_sq_GetIntData(obj, SkillId, Idx); // return ret + HookIntData(obj, SkillId, Idx); // } // function sq_GetLevelData(obj, SkillId, Idx, SkillLevel) { // local ret = L_sq_GetLevelData(obj, SkillId, Idx, SkillLevel); // return ret + HookLevelData(obj, SkillId, Idx); // } // function sq_getLevelData(obj, SkillId, Idx, SkillLevel) { // local ret = L_sq_GetLevelData(obj, SkillId, Idx, SkillLevel); // return ret + HookLevelData(obj, SkillId, Idx); // } function getReversalASCII(string) { local ASCII; switch(string){ case 10 :ASCII = "\n" ;break; case 32 :ASCII = " " ;break; case 33 :ASCII = "!" ;break; case 35 :ASCII = "#" ;break; case 36 :ASCII = "$" ;break; case 37 :ASCII = "%" ;break; case 38 :ASCII = "&" ;break; case 39 :ASCII = "'" ;break; case 40 :ASCII = "(" ;break; case 41 :ASCII = ")" ;break; case 42 :ASCII = "*" ;break; case 43 :ASCII = "+" ;break; case 44 :ASCII = "," ;break; case 45 :ASCII = "-" ;break; case 46 :ASCII = "." ;break; case 47 :ASCII = "/" ;break; case 58 :ASCII = ":" ;break; case 59 :ASCII = ";" ;break; case 60 :ASCII = "<" ;break; case 61 :ASCII = "=" ;break; case 62 :ASCII = ">" ;break; case 63 :ASCII = "?" ;break; case 64 :ASCII = "@" ;break; case 91 :ASCII = "[" ;break; case 93 :ASCII = "]" ;break; case 94 :ASCII = "^" ;break; case 95 :ASCII = "_" ;break; case 96 :ASCII = "`" ;break; case 123 :ASCII = "{" ;break; case 124 :ASCII = "|" ;break; case 125 :ASCII = "}" ;break; case 126 :ASCII = "~" ;break; case 48 :ASCII = "0" ;break; case 49 :ASCII = "1" ;break; case 50 :ASCII = "2" ;break; case 51 :ASCII = "3" ;break; case 52 :ASCII = "4" ;break; case 53 :ASCII = "5" ;break; case 54 :ASCII = "6" ;break; case 55 :ASCII = "7" ;break; case 56 :ASCII = "8" ;break; case 57 :ASCII = "9" ;break; case 65 :ASCII = "A" ;break; case 66 :ASCII = "B" ;break; case 67 :ASCII = "C" ;break; case 68 :ASCII = "D" ;break; case 69 :ASCII = "E" ;break; case 70 :ASCII = "F" ;break; case 71 :ASCII = "G" ;break; case 72 :ASCII = "H" ;break; case 73 :ASCII = "I" ;break; case 74 :ASCII = "J" ;break; case 75 :ASCII = "K" ;break; case 76 :ASCII = "L" ;break; case 77 :ASCII = "M" ;break; case 78 :ASCII = "N" ;break; case 79 :ASCII = "O" ;break; case 80 :ASCII = "P" ;break; case 81 :ASCII = "Q" ;break; case 82 :ASCII = "R" ;break; case 83 :ASCII = "S" ;break; case 84 :ASCII = "T" ;break; case 85 :ASCII = "U" ;break; case 86 :ASCII = "V" ;break; case 87 :ASCII = "W" ;break; case 88 :ASCII = "X" ;break; case 89 :ASCII = "Y" ;break; case 90 :ASCII = "Z" ;break; case 97 :ASCII = "a" ;break; case 98 :ASCII = "b" ;break; case 99 :ASCII = "c" ;break; case 100 :ASCII = "d" ;break; case 101 :ASCII = "e" ;break; case 102 :ASCII = "f" ;break; case 103 :ASCII = "g" ;break; case 104 :ASCII = "h" ;break; case 105 :ASCII = "i" ;break; case 106 :ASCII = "j" ;break; case 107 :ASCII = "k" ;break; case 108 :ASCII = "l" ;break; case 109 :ASCII = "m" ;break; case 110 :ASCII = "n" ;break; case 111 :ASCII = "o" ;break; case 112 :ASCII = "p" ;break; case 113 :ASCII = "q" ;break; case 114 :ASCII = "r" ;break; case 115 :ASCII = "s" ;break; case 116 :ASCII = "t" ;break; case 117 :ASCII = "u" ;break; case 118 :ASCII = "v" ;break; case 119 :ASCII = "w" ;break; case 120 :ASCII = "x" ;break; case 121 :ASCII = "y" ;break; case 122 :ASCII = "z" ;break; default :ASCII = "";break; } return ASCII; } function KeyInputCallBack(code) { if("GlobaNtInput" in getroottable()){ local NT = getroottable().GlobaNtInput; foreach(Key, Value in NT) { Value(code); } } } function RegisterInputHook(FuncName,Func) { if("GlobaNtInput" in getroottable()){ local NT = getroottable().GlobaNtInput; NT.rawset(FuncName,Func); }else{ local NT = {}; NT.rawset(FuncName,Func); getroottable().GlobaNtInput <- NT; } } function ErasesInputHook(FuncName) { if("GlobaNtInput" in getroottable()){ local NT = getroottable().GlobaNtInput; if(NT.rawin(FuncName)){ NT.rawdelete(FuncName); } } } //基础工具类 class BasicsDrawTool { 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; } //绘制数字 // obj -- X -- Y -- 数值 -- ani路径前缀 -- 间隔 -- 数字1偏移坐标 function T_DrawCustomNum(obj, xPos, yPos, num, str, Interval) { local NumStr = num.tostring(); for (local i = 0; i < NumStr.len(); ++i) { local DrawNum = NumStr.slice(i, i + 1); local ani = obj.getVar().GetAnimationMap(DrawNum + str, str + DrawNum + ".ani"); sq_DrawSpecificFrame(ani, xPos + (i * Interval), yPos, false, 0, false, 1.0); } } //绘制时间数字 // obj -- X -- Y -- 数值 -- ani路径前缀 -- 间隔 -- 数字1偏移坐标 function T_DrawCustomTimeNum(obj, xPos, yPos, num, str, Interval, OneDeviation) { local len = (num.tostring()).len(); for (local i = len; i > 0; i--) { local fg = 0; local DrawNum = (num.tostring()).slice(i - 1, i); //one += OneDeviation * abs(i - (len - 1)); if (i < (len - 1)) fg = -10; local ani = obj.getVar().GetAnimationMap(DrawNum + str, str + DrawNum + ".ani"); sq_AnimationProc(ani); sq_drawCurrentFrame(ani, xPos + ((i - len) * Interval) + fg, yPos, true); } } //绘制汉字 obj -- X坐标 -- Y坐标 -- 汉字 -- RGBA function T_DrawCode(posX, posY, char, rgba) { L_Code_STL(char, posX, posY, rgba, 0); } //初始化根表成员 function InitClass(Name) { local RootTab = getroottable(); if (RootTab.rawin(Name) == true) { RootTab.rawdelete(Name); } } function T_LogError(msg) { local f = file("Yosin.Error", "a+"); foreach(char in msg) { f.writen(char, 'b'); } f.writen('\n', 'b'); } //错误抛出 function T_ErrorPrint(exception, Type) { local allStr = ""; allStr += "AN ERROR HAS OCCURED [" + exception + "]\n"; allStr += "CALLSTACK\n"; for (local i = -10; i < 20; i++) { local tab1 = getstackinfos(i); if (typeof tab1 != "null") { local Write = true; local StrBuffer = ""; foreach(name, value in tab1) { if (value == "unknown" || value == "getstackinfos" || value == "errorhandler" || value == -1) { Write = false; break; } switch (name) { case "func": StrBuffer += "*Function: [ " + value + " ] \n\n"; break; case "src": StrBuffer += "*Src: [ " + value + " ] \n"; break; case "line": StrBuffer += "*Line: [ " + value + " ] \n"; break; case "locals": StrBuffer += "*Address: [ " + value + " ] \n"; break; default: break; } } if (Write == true) allStr += StrBuffer; } } if (Type == false) print(allStr); else if (Type == true) BasicsDrawTool.T_LogError(allStr); } //获取汉字偏移 function GetOffserFromLen(char, offset) { return (char.len() * offset) } } //Hud按钮类 class HudButton extends BasicsDrawTool // obj -- 按钮名称 -- X坐标 -- Y坐标 -- Ani调用路径 -- 宽度 -- 高度 { obj = null; //Obj对象 buttonName = null; //按钮名称 x = null; //X坐标 y = null; //Y坐标 BaseAnifile = null; //调用Ani路径 width = null; //可点击宽度 length = null; //可点击高度 //构造函数 constructor(gObj, gButtonName, gX, gY, gAnifile, gWidth, gLength) { obj = gObj; buttonName = gButtonName; x = gX; y = gY; BaseAnifile = gAnifile; width = gWidth; length = gLength; } //绘制按钮 function DrawButton() { if (isDown()) y++; T_DrawDynamicAni(obj, BaseAnifile, x, y, buttonName); if (isInRect()) { } } function isInRect() { local mouseX = IMouse.GetXPos(); local mouseY = IMouse.GetYPos(); if (sq_IsIntersectRect(mouseX, mouseY, 5, 5, x, y, width, length)) return true; return false; } function isDown() { if (isInRect() && IMouse.IsLBDown()) { obj.getVar(buttonName).setBool(0, true); return true; } return false; } function isActive() { if (isInRect() && IMouse.IsLBUp() && obj.getVar(buttonName).getBool(0)) { obj.getVar(buttonName).setBool(0, false); return true; } return false; } } //HudPro按钮类 class ButtonPro extends BasicsDrawTool // obj -- 按钮名称 -- X坐标 -- Y坐标 -- Ani调用路径 -- 宽度 -- 高度 { obj = null; //Obj对象 State = 0; //按钮状态 ClickEnble = false; //点击效果 ButtonDynamic = false; //动态按钮效果 CustomClickEnble = false; //自定义点击效果 CustomClickAnifile = null; //自定义点击效果Ani路径 CustomButtonName = null; //自定义点击效果名称 CustomClickFrame = null; //自定义点击效果Ani编号 CustomClickx = null; //自定义点击效果X坐标 CustomClicky = null; //自定义点击效果Y坐标 RectEnble = false; //悬停效果 RectButtonName = null; //悬停名称 RectBaseAnifile = null; //悬停Ani路径 RectFrame = null; //非动态按钮的悬停调用Ani编号 Rectx = null; //悬停X坐标 Recty = null; //悬停Y坐标 ButtonName = null; //按钮名称 x = null; //X坐标 y = null; //Y坐标 BaseAnifile = null; //调用Ani路径 width = null; //可点击宽度 length = null; //可点击高度 //构造函数 constructor(gObj, gButtonName, gX, gY, gAnifile, gWidth, gLength) { obj = gObj; ButtonName = gButtonName; x = gX; y = gY; BaseAnifile = gAnifile; width = gWidth; length = gLength; } //绘制按钮 function Show() { if (ClickEnble) //是否开启点击效果 { if (isLBDown() && State == 0) //按下左键并且按钮处于弹起状态 { State = 1; //按键进入按下状态 ++y; } if (!isLBDown() && State == 1) //按下左键并且按钮处于弹起状态 { State = 0; //按键进入弹起状态 --y; } } if (CustomClickEnble) //是否开启自定义点击效果 { if (isLBDown()) //按下左键并且按钮处于弹起状态 { if (!ButtonDynamic) T_DrawStayAni(obj, CustomClickAnifile, CustomClickx, CustomClicky, CustomClickFrame, CustomButtonName); else T_DrawDynamicAni(obj, CustomClickAnifile, CustomClickx, CustomClicky, CustomButtonName); } } if (RectEnble) //开启悬停效果时 { if ((isInRect() && !isLBDown()) || (isInRect() && !CustomClickEnble)) //如果鼠标悬停的时候 并且没有点击的时候 { //IMouse.SetMouseTask(44); if (!ButtonDynamic) T_DrawStayAni(obj, RectBaseAnifile, Rectx, Recty, RectFrame, RectButtonName); else T_DrawDynamicAni(obj, RectBaseAnifile, Rectx, Recty, RectButtonName); } } if (!isInRect()) //如果鼠标没有悬停的时候 { //IMouse.SetMouseTask(0); if (!ButtonDynamic) T_DrawStayAni(obj, BaseAnifile, x, y, 0, ButtonName); else T_DrawDynamicAni(obj, BaseAnifile, x, y, ButtonName); } } //设置自定义点击效果 function SetCustomClickEnble(bool, gButtonName, gX, gY, gAnifile, gFrame) { CustomClickEnble = bool; //自定义点击效果 CustomClickAnifile = gAnifile; //自定义点击效果Ani路径 CustomButtonName = gButtonName; //自定义点击效果名称 CustomClickFrame = gFrame; //自定义点击效果Ani编号 CustomClickx = gX; //自定义点击效果X坐标 CustomClicky = gY; //自定义点击效果Y坐标 } //设置悬停效果 function SetRectEnble(bool, gButtonName, gX, gY, gAnifile, gFrame) { RectEnble = bool; //悬停效果 RectButtonName = gButtonName; //悬停名称 RectBaseAnifile = gAnifile; //悬停Ani路径 RectFrame = gFrame; //非动态按钮的悬停调用Ani编号 Rectx = gX; //悬停X坐标 Recty = gY; //悬停Y坐标 } //设置动态按钮 function SetClickEnble(bool) { ButtonDynamic = bool; } //设置点击效果 function SetClickEnble(bool) { ClickEnble = bool; } //悬停状态 function isInRect() { if (sq_IsIntersectRect(IMouse.GetXPos(), IMouse.GetYPos(), 5, 5, x, y, width, length)) return true; else return false; } //左键按下状态 function isLBDown() { if (isInRect() && IMouse.GetLButton() == 1) return true; else return false; } //左键弹起状态 function isLBUp() { if (isInRect() && IMouse.GetLButton() == 0) return true; else return false; } //左键双击状态 function IsLBDoubleClick() { if (isInRect() && IMouse.GetLButton() == 64) return true; else return false; } //左键单击状态 function isLBActive() { if (isInRect() && IMouse.isButtonUpEvent()) return true; else return false; } } //SwitchButtonPro按钮类 class SwitchButtonPro extends BasicsDrawTool // obj -- 按钮名称 -- X坐标 -- Y坐标 -- Ani调用路径 -- 宽度 -- 高度 { obj = null; //Obj对象 State = 0; //按钮状态 ClickEnble = false; //点击效果 ButtonDynamic = false; //动态按钮效果 SwitchState = false; //复选框是否选中 CustomClickEnble = false; //自定义点击效果 CustomClickAnifile = null; //自定义点击效果Ani路径 CustomButtonName = null; //自定义点击效果名称 CustomClickFrame = null; //自定义点击效果Ani编号 CustomClickx = null; //自定义点击效果X坐标 CustomClicky = null; //自定义点击效果Y坐标 RectEnble = false; //悬停效果 RectButtonName = null; //悬停名称 RectBaseAnifile = null; //悬停Ani路径 RectFrame = null; //非动态按钮的悬停调用Ani编号 Rectx = null; //悬停X坐标 Recty = null; //悬停Y坐标 ButtonName = null; //按钮名称 x = null; //X坐标 y = null; //Y坐标 BaseAnifile = null; //调用Ani路径 BaseAnifileFrame = null; //调用的Ani帧数 width = null; //可点击宽度 length = null; //可点击高度 //构造函数 constructor(gObj, gButtonName, gX, gY, gAnifile, gBaseAnifileFrame, gWidth, gLength) { obj = gObj; ButtonName = gButtonName; x = gX; y = gY; BaseAnifile = gAnifile; BaseAnifileFrame = gBaseAnifileFrame; width = gWidth; length = gLength; } //绘制按钮 function Show() { if (ClickEnble) //是否开启点击效果 { if (isLBDown() && State == 0) //按下左键并且按钮处于弹起状态 { State = 1; //按键进入按下状态 ++y; } if (!isLBDown() && State == 1) //按下左键并且按钮处于弹起状态 { State = 0; //按键进入弹起状态 --y; } } if (CustomClickEnble) //是否开启自定义点击效果 { if (isLBDown()) //按下左键并且按钮处于弹起状态 { if (!ButtonDynamic) T_DrawStayAni(obj, CustomClickAnifile, CustomClickx, CustomClicky, CustomClickFrame, CustomButtonName); else T_DrawDynamicAni(obj, CustomClickAnifile, CustomClickx, CustomClicky, CustomButtonName); } } if (RectEnble) //开启悬停效果时 { if ((isInRect() && !isLBDown()) || (isInRect() && !CustomClickEnble)) //如果鼠标悬停的时候 并且没有点击的时候 { //IMouse.SetMouseTask(44); if (!ButtonDynamic) T_DrawStayAni(obj, RectBaseAnifile, Rectx, Recty, RectFrame, RectButtonName); else T_DrawDynamicAni(obj, RectBaseAnifile, Rectx, Recty, RectButtonName); } } if (!isInRect() && !SwitchState) //如果鼠标没有悬停的时候 { //IMouse.SetMouseTask(0); if (!ButtonDynamic) T_DrawStayAni(obj, BaseAnifile, x, y, BaseAnifileFrame, ButtonName); else T_DrawDynamicAni(obj, BaseAnifile, x, y, ButtonName); } if (!isInRect() && SwitchState) { if (!ButtonDynamic) T_DrawStayAni(obj, RectBaseAnifile, Rectx, Recty, RectFrame, RectButtonName); else T_DrawDynamicAni(obj, RectBaseAnifile, Rectx, Recty, RectButtonName); } } //设置自定义点击效果 function SetCustomClickEnble(bool, gButtonName, gX, gY, gAnifile, gFrame) { CustomClickEnble = bool; //自定义点击效果 CustomClickAnifile = gAnifile; //自定义点击效果Ani路径 CustomButtonName = gButtonName; //自定义点击效果名称 CustomClickFrame = gFrame; //自定义点击效果Ani编号 CustomClickx = gX; //自定义点击效果X坐标 CustomClicky = gY; //自定义点击效果Y坐标 } //设置悬停效果 function SetRectEnble(bool, gButtonName, gX, gY, gAnifile, gFrame) { RectEnble = bool; //悬停效果 RectButtonName = gButtonName; //悬停名称 RectBaseAnifile = gAnifile; //悬停Ani路径 RectFrame = gFrame; //非动态按钮的悬停调用Ani编号 Rectx = gX; //悬停X坐标 Recty = gY; //悬停Y坐标 } //设置动态按钮 function SetClickEnble(bool) { ButtonDynamic = bool; } //设置点击效果 function SetClickEnble(bool) { ClickEnble = bool; } //悬停状态 function isInRect() { if (sq_IsIntersectRect(IMouse.GetXPos(), IMouse.GetYPos(), 5, 5, x, y, width, length)) return true; else return false; } //左键按下状态 function isLBDown() { if (isInRect() && IMouse.GetLButton() == 1) return true; else return false; } //左键弹起状态 function isLBUp() { if (isInRect() && IMouse.GetLButton() == 0) return true; else return false; } //左键双击状态 function IsLBDoubleClick() { if (isInRect() && IMouse.GetLButton() == 64) return true; else return false; } //左键单击状态 function isLBActive() { if (isInRect() && IMouse.isButtonUpEvent()) return true; else return false; } } //设置窗口SwitchButtonPro按钮继承类 class SettingWindowSwitchButtonPro extends SwitchButtonPro { SwitchStateAniName = null; SwitchStateAniFile = null; SwitchStateAniFrame = null; //绘制按钮 function Show() { if (ClickEnble) //是否开启点击效果 { if (isLBDown() && State == 0) //按下左键并且按钮处于弹起状态 { State = 1; //按键进入按下状态 ++y; } if (!isLBDown() && State == 1) //按下左键并且按钮处于弹起状态 { State = 0; //按键进入弹起状态 --y; } } if (CustomClickEnble) //是否开启自定义点击效果 { if (isLBDown()) //按下左键并且按钮处于弹起状态 { if (!ButtonDynamic) T_DrawStayAni(obj, CustomClickAnifile, CustomClickx, CustomClicky, CustomClickFrame, CustomButtonName); else T_DrawDynamicAni(obj, CustomClickAnifile, CustomClickx, CustomClicky, CustomButtonName); } } if (RectEnble) //开启悬停效果时 { if ((isInRect() && !isLBDown()) || (isInRect() && !CustomClickEnble) && !SwitchState) //如果鼠标悬停的时候 并且没有点击的时候 { //IMouse.SetMouseTask(44); if (!ButtonDynamic) T_DrawStayAni(obj, RectBaseAnifile, Rectx, Recty, RectFrame, RectButtonName); else T_DrawDynamicAni(obj, RectBaseAnifile, Rectx, Recty, RectButtonName); } } if (!isInRect() && !SwitchState) //如果鼠标没有悬停的时候 { //IMouse.SetMouseTask(0); if (!ButtonDynamic) T_DrawStayAni(obj, BaseAnifile, x, y, BaseAnifileFrame, ButtonName); else T_DrawDynamicAni(obj, BaseAnifile, x, y, ButtonName); } if (SwitchState) { if (!ButtonDynamic) T_DrawStayAni(obj, SwitchStateAniFile, Rectx, Recty, SwitchStateAniFrame, SwitchStateAniName); else T_DrawDynamicAni(obj, RectBaseAnifile, Rectx, Recty, RectButtonName); } } function SetSwitchStateAni(gButtonName, gAnifile, gFrame) { SwitchStateAniName = gButtonName; SwitchStateAniFile = gAnifile; SwitchStateAniFrame = gFrame; } } //STL容器类 class STL { thisname = null; Type = null; constructor(G_thisname, G_Type) { thisname = G_thisname; local NameType = typeof(thisname); if (NameType != "string") return; Type = G_Type; L_New_STL(thisname, Type); } //设置容器值 function Set_STL(Idx, Value) { return L_Set_STL(thisname, Type, Idx, Value); } //获取容器值 function Get_STL(Idx) { return L_Get_STL(thisname, Type, Idx); } } //STL 时间容器类 class TimeSTL { thisname = null; //时间容器名称 MaxTime = null; //时间容器最大时间 //构造时间容器 constructor(G_thisname, G_MaxTime) { thisname = G_thisname; local NameType = typeof(thisname); if (NameType != "string") return; MaxTime = G_MaxTime; L_Timer_STL(thisname, MaxTime, 0); //创建时间容器 } //开启时间容器 非Proc环境 function Start() { return L_Timer_STL(thisname, MaxTime, 1); } //获取时间容器值 function Get() { return L_Timer_STL(thisname, MaxTime, 2); } //重置时间容器 非Proc环境 function Reset() { return L_Timer_STL(thisname, MaxTime, 3); } //暂停时间容器 非Proc环境 function Stop() { return L_Timer_STL(thisname, MaxTime, 4); } //继续时间容器 非Proc环境 function Run() { return L_Timer_STL(thisname, MaxTime, 5); } //销毁时间容器 非Proc环境 function Delete() { return L_Timer_STL(thisname, MaxTime, 6); } } //STL Json容器类 class Json_STL { thisname = null; //Json容器名称 state = null; //构造Json容器 constructor(G_thisname) { thisname = G_thisname; local NameType = typeof(thisname); if (NameType != "string") return; state = L_Json_STL(thisname, 0); //创建Json容器 } //从str构造Json包 function Parse(Str, Type, Retain) { return L_Json_STL(thisname, Str, Type, Retain); } //构造Json包 function Put(key, value) { return L_Json_STL(thisname, key, value); } //查询Json包 function GetString() { return L_Json_STL(thisname, 1); } //查询Json包 function Get(key) { return L_Json_STL(thisname, key); } //销毁Json包 function Delete() { return L_Json_STL(thisname, 2); } //通过Table构造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 Str += Value; if (Pos != Size) Str += ","; } Str += "}"; return Str; } } //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_GetMyMasterCharacter(); 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_GetMyMasterCharacter(); if (KeyPressNB.KeyDown(obj, KeyValue, VarKey)) { return true; } KeyPressNB.KeyUp(obj, KeyValue, VarKey); } } class System { //将值以数组形式插入Table function InsertArrayInTable(TableObj, Key, FlagKey, Value) { local Tab; if (TableObj.rawin(Key)) { Tab = TableObj[Key]; } else { Tab = {}; } Tab.rawset(FlagKey, Value); TableObj.rawset(Key, Tab); } } //游戏计算类 class GameC { //抛物线函数计算 function getQuadraticFunction(obj, x, b, c) { local a = (-b.tofloat() * 4) / (c.tofloat() * c.tofloat()); return a.tofloat() * (x.tofloat() - c.tofloat() / 2) * (x.tofloat() - c.tofloat() / 2) + b.tofloat(); } function RemoveObjectAppend(obj, str) { local objectManager = obj.getObjectManager(); for (local i = 0; i < objectManager.getCollisionObjectNumber(); i += 1) { local object = objectManager.getCollisionObject(i); local appendage = CNSquirrelAppendage.sq_GetAppendage(object, str); if (appendage) { appendage.sq_DeleteAppendages(); CNSquirrelAppendage.sq_RemoveAppendage(obj, str); } } } //找到矩形范围敌人 function findRoundNearAllEnemyRect(obj, Xvar, Yvar, Dct) { local ObjTab = []; local objectManager = obj.getObjectManager(); for (local i = 0; i < objectManager.getCollisionObjectNumber(); i += 1) { local object = objectManager.getCollisionObject(i); if (object && obj.isEnemy(object) && object.isObjectType(OBJECTTYPE_ACTIVE)) { switch (Dct) { case 0: local Distance = sq_GetDistance(obj.getXPos(), obj.getYPos(), object.getXPos(), object.getYPos(), true); local Xoffset = obj.getXPos() - object.getXPos(); if (Xoffset >= 0 && Xoffset <= Xvar && sqrt((Distance * Distance) - (Xoffset * Xoffset)) <= Yvar) { ObjTab.append(object); } break; case 1: local Distance = sq_GetDistance(obj.getXPos(), obj.getYPos(), object.getXPos(), object.getYPos(), true); local Xoffset = object.getXPos() - obj.getXPos(); if (Xoffset >= 0 && Xoffset <= Xvar && sqrt((Distance * Distance) - (Xoffset * Xoffset)) <= Yvar) { ObjTab.append(object); } break; case 2: local Distance = sq_GetDistance(obj.getXPos(), obj.getYPos(), object.getXPos(), object.getYPos(), true); local Yoffset = obj.getYPos() - object.getYPos(); if (Yoffset >= 0 && Yoffset <= Yvar && sqrt((Distance * Distance) - (Yoffset * Yoffset)) <= Xvar) { ObjTab.append(object); } break; case 3: local Distance = sq_GetDistance(obj.getXPos(), obj.getYPos(), object.getXPos(), object.getYPos(), true); local Yoffset = object.getYPos() - obj.getYPos(); if (Yoffset >= 0 && Yoffset <= Yvar && sqrt((Distance * Distance) - (Yoffset * Yoffset)) <= Xvar) { ObjTab.append(object); } break; default: break; } } } return ObjTab; } //召唤怪物 -- obj -- 怪物ID -- 怪物等级 -- 怪物存在时间 -- 出现X坐标 -- 出现Y坐标 -- 出现Z坐标 function sendSummonMonsterPacketWithFriend(obj, monsterID, level, summonTime, posx, posy, posz, camp) { sq_BinaryStartWrite(); sq_BinaryWriteByte(0); //出现方式 sq_BinaryWriteDword(monsterID); //怪物编号 sq_BinaryWriteWord(camp); //阵营 sq_BinaryWriteByte(level); //等级 sq_BinaryWriteWord(-1); //未知 sq_BinaryWriteWord(0); //未知 sq_BinaryWriteByte(1); //未知 sq_BinaryWriteByte(2); //未知 sq_BinaryWriteByte(0); //未知 sq_BinaryWriteDword(summonTime); //存在时间 sq_BinaryWriteDword(-1); //未知 sq_BinaryWriteByte(2); //未知 sq_SendCreatePassiveObjectPacketPos(obj, 30562, 0, posx, posy, posz); sq_SendCreatePassiveObjectPacketPos(obj, 48024, 0, posx, posy, posz); } //销毁特效 function DestroyPassiveObject(obj, Index) { local ballCount = obj.getMyPassiveObjectCount(Index); for (local i = 0; i < ballCount; ++i) { local magicBall = obj.getMyPassiveObject(Index, i) if (!magicBall) continue; if (obj.sq_IsMyControlObject()) { sq_SendDestroyPacketPassiveObject(magicBall); } } } //获取通用Ap function getCurrencyAppendage(obj) { if (!CNSquirrelAppendage.sq_IsAppendAppendage(obj, "appendage/currency.nut")) { local appendage = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, 174, false, "appendage/currency.nut", true); return appendage; } else { return obj.GetSquirrelAppendage("appendage/currency.nut"); } } } //活动图标类 class EventIcon extends BasicsDrawTool { //Key Key = null; //活动图标文字 EventStr = null; //活动图标Ani编号 EventFrame = null; //鼠标对象 Mobj = null; //绑定对象 BandObject = null; x = null; y = null; constructor(gEventStr, gEventFrame, gKey, gBandObject) { this.EventStr = gEventStr; this.EventFrame = gEventFrame; this.Key = gKey; this.BandObject = gBandObject; if (getroottable().rawin("MouseObject")) Mobj = getroottable()["MouseObject"]; local RootTab = getroottable(); if (RootTab.rawin("YosinEventSystem")) { local Arr = RootTab["YosinEventSystem"]; local TryAppend = true; local wpos; foreach(pos , value in Arr) { if (value.Key == this.Key) { TryAppend = false; wpos = pos; } } if (TryAppend) { Arr.append(this); RootTab.rawset("YosinEventSystem", Arr); } else{ Arr[wpos] = this; RootTab.rawset("YosinEventSystem", Arr); } } else { local Arr = []; Arr.append(this); RootTab.rawset("YosinEventSystem", Arr); } } function Show(obj, X, Y) { x = X; y = Y; //绘制框 T_DrawDynamicAni(obj, "common/yosinevent/eventsystemeff.ani", X, Y, "YosinEventIconEffA"); try { if (isLBDown()) { //绘制活动图标 L_sq_DrawImg("interface2/yosin/eventsystemlist.img", EventFrame, X, Y + 1); //T_DrawStayAni(obj, "common/yosinevent/eventsystemlist.ani", X, Y + 1, EventFrame, "YosinEventIconKey" + Key); } else { //绘制活动图标 L_sq_DrawImg("interface2/yosin/eventsystemlist.img", EventFrame, X, Y); } } catch (exception) { if (isLBDown()) { //绘制活动图标 T_DrawStayAni(obj, "common/yosinevent/eventsystemlist.ani", X, Y + 1, EventFrame, "YosinEventIconKey" + Key); } else { //绘制活动图标 T_DrawStayAni(obj, "common/yosinevent/eventsystemlist.ani", X, Y, EventFrame, "YosinEventIconKey" + Key); } } } function StrShow(obj, X, Y) { //悬停 if (isInRect() && EventStr) { local count = EventStr.len() / 3; T_DrawStayAni(obj, "common/yosinevent/eventsystem.ani", X - (count * 7), Y - 24, 0, "YosinEventIconStrEffL"); for (local i = 0; i < count; i++) { T_DrawStayAni(obj, "common/yosinevent/eventsystem.ani", X - (count * 7) + 5 + (i * 15), Y - 24, 1, "YosinEventIconStrEffZ"); } T_DrawStayAni(obj, "common/yosinevent/eventsystem.ani", X - (count * 7) + 5 + (count * 15), Y - 24, 2, "YosinEventIconStrEffR"); L_sq_DrawCode(EventStr, X - (count * 4), Y - 17, sq_RGBA(255, 255, 255, 250), 0, 1); } if (isLBActive()) { BandObject.MainState = true; BandObject.OpenClassCallBack(); } } //悬停状态 function isInRect() { if (sq_IsIntersectRect(IMouse.GetXPos(), IMouse.GetYPos(), 1, 1, x, y, 20, 20)) return true; else return false; } //左键按下状态 function isLBDown() { if (isInRect() && Mobj.Lb == 1) return true; else return false; } //左键弹起状态 function isLBUp() { if (isInRect() && Mobj.Lb == 0) return true; else return false; } //左键单击状态 function isLBActive() { if (isInRect() && Mobj.LbEvent) return true; else return false; } } function YosinEventIconInfoCallBack(Chunk) { local Buffer = Json_STL("YosinEventIconInfoCallBack_Json"); Buffer.Parse(Chunk, 0, false); local RootTab = getroottable(); local X = Buffer.Get("YosinEventIconInfoXpos"); local Y = Buffer.Get("YosinEventIconInfoYpos"); RootTab.rawset("YosinEventIconInfoXpos", X); RootTab.rawset("YosinEventIconInfoYpos", Y); } Pack_Control.rawset(30002, YosinEventIconInfoCallBack); //绘制娱心活动图标 function DrawYosinEventIconSystem(obj) { local X = 600; local Y = 527; local RootTab = getroottable(); if (!RootTab.rawin("YosinGetUserInfo") && L_sq_RA(0x1A5FB4C, "0x14+0x28+") >= 1) { local T = { op = 30000 } local str = Json.Encode(T); L_sq_SendPackType(130); L_sq_SendPackWChar(str); L_sq_SendPack(); RootTab.rawset("YosinGetUserInfo", true); } if (RootTab.rawin("YosinEventIconInfoXpos")) X = RootTab["YosinEventIconInfoXpos"]; if (RootTab.rawin("YosinEventIconInfoYpos")) Y = RootTab["YosinEventIconInfoYpos"]; local BaseEventCount = L_sq_RA(L_sq_RA(0x1A39C2C) + 0x6c); local DrawCount = BaseEventCount; local StrDrawCount = BaseEventCount; if (RootTab.rawin("YosinEventSystem")) { local EventArr = RootTab["YosinEventSystem"]; local OneLineOffset = BaseEventCount * 20; local Draw = true; //先遍历一遍看看有没有窗口被打开 foreach(E in EventArr) { if (E.BandObject.MainState == true) { Draw = false; } } foreach(V in EventArr) { V.Show(obj, X + ((DrawCount % 8) * 20), Y - ((DrawCount / 8) * 20)); DrawCount++; } //如果窗口被打开就不再显示悬停文字 if (Draw) { foreach(SV in EventArr) { SV.StrShow(obj, X + ((StrDrawCount % 8) * 20), Y - ((StrDrawCount / 8) * 20)); StrDrawCount++; } } } } class PlayerEachIcon extends BasicsDrawTool { Name = null; X = null; Y = null; //鼠标对象 Mobj = null; PlayerName = null; DrawSwitch = false; Func = null; constructor(gName, gFunc) { Name = gName; Func = gFunc; if (getroottable().rawin("MouseObject")) Mobj = getroottable()["MouseObject"]; local RootTab = getroottable(); if (RootTab.rawin("YosinPlayerEachSystem")) { local Arr = RootTab["YosinPlayerEachSystem"]; local TryAppend = true; foreach(value in Arr) { if (value.Name == this.Name) { TryAppend = false; } } if (TryAppend) { Arr.append(this); RootTab.rawset("YosinPlayerEachSystem", Arr); } } else { local Arr = []; Arr.append(this); RootTab.rawset("YosinPlayerEachSystem", Arr); } } function Show(x, y) { X = x; Y = y; DrawSwitch = true; PlayerName = L_Sq_GetPlayerEachName(); } function DrawShow(obj) { if (DrawSwitch) { //如果悬停 if (isInRect()) { if (isLBDown()) { T_DrawStayAni(obj, "common/yosinevent/playersystemeff.ani", X, Y, 1, "PlayerEachIconKey2a"); L_sq_DrawCode(Name, X + 24, Y + 5, sq_RGBA(255, 161, 31, 250), 0, 1); } else { T_DrawStayAni(obj, "common/yosinevent/playersystemeff.ani", X, Y, 1, "PlayerEachIconKey1a"); L_sq_DrawCode(Name, X + 24, Y + 4, sq_RGBA(255, 161, 31, 250), 0, 1); } } else { T_DrawStayAni(obj, "common/yosinevent/playersystemeff.ani", X, Y, 0, "PlayerEachIconKey0a"); L_sq_DrawCode(Name, X + 24, Y + 4, sq_RGBA(255, 161, 31, 250), 0, 1); } if (isLBActive()) { Func(PlayerName); local RootTab = getroottable(); if (RootTab.rawin("YosinPlayerEachSystem")) { local PlayerEachArr = RootTab["YosinPlayerEachSystem"]; foreach(pos, V in PlayerEachArr) { V.DrawSwitch = false; } } } } } function DrawShowMouse(obj){ if (DrawSwitch) { if (!isInRect()){ if (Mobj.LbEvent || Mobj.RbEvent) { local RootTab = getroottable(); if (RootTab.rawin("YosinPlayerEachSystem")) { local PlayerEachArr = RootTab["YosinPlayerEachSystem"]; foreach(pos, V in PlayerEachArr) { V.DrawSwitch = false; } } } } } } //悬停状态 function isInRect() { if (sq_IsIntersectRect(IMouse.GetXPos(), IMouse.GetYPos(), 1, 1, X, Y, 100, 21)) return true; else return false; } //左键按下状态 function isLBDown() { if (isInRect() && Mobj.Lb == 1) return true; else return false; } //左键弹起状态 function isLBUp() { if (isInRect() && Mobj.Lb == 0) return true; else return false; } //左键单击状态 function isLBActive() { if (isInRect() && Mobj.LbEvent) return true; else return false; } } function Sq_PlayerEachPos(x, y) { local RootTab = getroottable(); if (RootTab.rawin("YosinPlayerEachSystem")) { local PlayerEachArr = RootTab["YosinPlayerEachSystem"]; local obj = sq_GetMyMasterCharacter(); foreach(pos, V in PlayerEachArr) { if (x < 600) V.Show(x + 100, y + (pos * 21)); else V.Show(x - 100, y + (pos * 21)); } } } //绘制娱心玩家交互功能 function DrawYosinPlayerEachSystem(obj) { local RootTab = getroottable(); if (RootTab.rawin("YosinPlayerEachSystem")) { local PlayerEachArr = RootTab["YosinPlayerEachSystem"]; local obj = sq_GetMyMasterCharacter(); foreach(pos, V in PlayerEachArr) { V.DrawShow(obj); } foreach(npos, nV in PlayerEachArr) { nV.DrawShowMouse(obj); } } } class ControllerC { Value = null; MaxValue = null; constructor(gMaxValue) { this.MaxValue = gMaxValue; Value = 0; } //+ function A() { if (Value < MaxValue) Value++; } //- function M() { if (Value > 0) Value--; } } class ScrollControl extends BasicsDrawTool { Controller = null; List = null; SliceCount = null; FocusCount = null; FocusList = null; //重置FocusList function SliceList() { FocusList = null; FocusList = []; for (local i = 0; i < (this.List.len() / SliceCount) + 1; i++) { if (i >= Controller.Value && i < (Controller.Value + FocusCount)) { local slen = (i + 1) * SliceCount; local buflist; if (slen > this.List.len()) buflist = this.List.slice(i * SliceCount); else buflist = this.List.slice(i * SliceCount, slen); FocusList.append(buflist); } } } constructor(gList, gSliceCount, gFocusCount) { //克隆List this.List = gList; this.SliceCount = gSliceCount; this.FocusCount = gFocusCount; //初始化控制器 local CMax = this.List.len() / this.SliceCount; //取模一下判断是否整除 if ((this.List.len() % this.SliceCount) > 0) CMax++; Controller = ControllerC(CMax - FocusCount); SliceList(); } //+ function A() { Controller.A(); SliceList(); } //- function M() { Controller.M(); SliceList(); } } //技能类 { function Sq_Get_Ex_IntData(SkillAddress, Idx, objAddress) { local RetData = 0; local Root = getroottable(); local RootTab; if (!Root.rawin("LenheartSkillManager")) { local T = {}; Root.rawset("LenheartSkillManager", T); } RootTab = Root["LenheartSkillManager"]; local Key = "LJ" + objAddress + "SkillAddress" + SkillAddress + "Idx" + Idx; if (RootTab.rawin(Key)) { RetData += RootTab[Key]; } if (!Root.rawin("LenheartTalismanSkillManager")) { local T = {}; Root.rawset("LenheartTalismanSkillManager", T); } RootTab = Root["LenheartTalismanSkillManager"]; if (RootTab.rawin(Key)) { RetData += RootTab[Key]; } return RetData; } function Sq_Get_Ex_LevelData(SkillAddress, Idx, objAddress) { local RetData = 0; local Root = getroottable(); local RootTab; if (!Root.rawin("LenheartSkillManager")) { local T = {}; Root.rawset("LenheartSkillManager", T); } RootTab = Root["LenheartSkillManager"]; local Key = "EX_LJ" + "SkillAddress" + SkillAddress + "Idx" + Idx; if (RootTab.rawin(Key)) { RetData += RootTab[Key]; } if (!Root.rawin("LenheartTalismanSkillManager")) { local T = {}; Root.rawset("LenheartTalismanSkillManager", T); } RootTab = Root["LenheartTalismanSkillManager"]; if (RootTab.rawin(Key)) { RetData += RootTab[Key]; } return RetData; } function Sq_Get_Ex_SkillCoolTime(SkillAddress, Idx, objAddress) { local RetData = 0; local Root = getroottable(); local RootTab; if (!Root.rawin("LenheartSkillManager")) { local T = {}; Root.rawset("LenheartSkillManager", T); } RootTab = Root["LenheartSkillManager"]; local Key = "CT_LJ" + "SkillAddress" + SkillAddress; if (RootTab.rawin(Key)) { RetData += RootTab[Key]; } if (!Root.rawin("LenheartTalismanSkillManager")) { local T = {}; Root.rawset("LenheartTalismanSkillManager", T); } RootTab = Root["LenheartTalismanSkillManager"]; if (RootTab.rawin(Key)) { RetData += RootTab[Key]; } return RetData; } function AddSkillCoolTime(obj, SkillId, Value) { local Root = getroottable(); local RootTab; if (!Root.rawin("LenheartSkillManager")) { local T = {}; Root.rawset("LenheartSkillManager", T); } RootTab = Root["LenheartSkillManager"]; local objAddress = L_Sq_GetObjectAddress(obj); local SkillAddress = L_Sq_GetSkillAddress(SkillId); local Key = "CT_LJ" + "SkillAddress" + SkillAddress; if (RootTab.rawin(Key)) { local basedata = RootTab[Key]; basedata += Value; RootTab.rawset(Key, basedata); } else RootTab.rawset(Key, Value); } function ClearSkillCoolTime(obj, SkillId) { local Root = getroottable(); local RootTab; if (!Root.rawin("LenheartSkillManager")) { local T = {}; Root.rawset("LenheartSkillManager", T); } RootTab = Root["LenheartSkillManager"]; local objAddress = L_Sq_GetObjectAddress(obj); local SkillAddress = L_Sq_GetSkillAddress(SkillId); local Key = "CT_LJ" + "SkillAddress" + SkillAddress; if (RootTab.rawin(Key)) { RootTab.rawset(Key, 0); } else RootTab.rawset(Key, 0); } function AddIntData(obj, SkillId, Idx, Value) { local Root = getroottable(); local RootTab; if (!Root.rawin("LenheartSkillManager")) { local T = {}; Root.rawset("LenheartSkillManager", T); } RootTab = Root["LenheartSkillManager"]; local objAddress = L_Sq_GetObjectAddress(obj); local SkillAddress = L_Sq_GetSkillAddress(SkillId); local Key = "LJ" + objAddress + "SkillAddress" + SkillAddress + "Idx" + Idx; if (RootTab.rawin(Key)) { local basedata = RootTab[Key]; basedata += Value; RootTab.rawset(Key, basedata); } else RootTab.rawset(Key, Value); } function ClearIntData(obj, SkillId, Idx) { local Root = getroottable(); local RootTab; if (!Root.rawin("LenheartSkillManager")) { local T = {}; Root.rawset("LenheartSkillManager", T); } RootTab = Root["LenheartSkillManager"]; local objAddress = L_Sq_GetObjectAddress(obj); local SkillAddress = L_Sq_GetSkillAddress(SkillId); local Key = "LJ" + objAddress + "SkillAddress" + SkillAddress + "Idx" + Idx; if (RootTab.rawin(Key)) { RootTab.rawset(Key, 0); } else RootTab.rawset(Key, 0); } function HookIntData(obj, SkillId, Idx) { local RetData = 0; local Root = getroottable(); local RootTab; if (!Root.rawin("LenheartSkillManager")) { local T = {}; Root.rawset("LenheartSkillManager", T); } RootTab = Root["LenheartSkillManager"]; local objAddress = L_Sq_GetObjectAddress(obj); local SkillAddress = L_Sq_GetSkillAddress(SkillId); local Key = "LJ" + objAddress + "SkillAddress" + SkillAddress + "Idx" + Idx; if (RootTab.rawin(Key)) { RetData += RootTab[Key]; } if (!Root.rawin("LenheartTalismanSkillManager")) { local T = {}; Root.rawset("LenheartTalismanSkillManager", T); } RootTab = Root["LenheartTalismanSkillManager"]; if (RootTab.rawin(Key)) { RetData += RootTab[Key]; } return RetData; } function AddLevelData(obj, SkillId, Idx, Value) { local Root = getroottable(); local RootTab; if (!Root.rawin("LenheartSkillManager")) { local T = {}; Root.rawset("LenheartSkillManager", T); } RootTab = Root["LenheartSkillManager"]; local objAddress = L_Sq_GetObjectAddress(obj); local SkillAddress = L_Sq_GetSkillAddress(SkillId); local Key = "EX_LJ" + "SkillAddress" + SkillAddress + "Idx" + Idx; if (RootTab.rawin(Key)) { local basedata = RootTab[Key]; basedata += Value; RootTab.rawset(Key, basedata); } else RootTab.rawset(Key, Value); } function ClearLevelData(obj, SkillId, Idx) { local Root = getroottable(); local RootTab; if (!Root.rawin("LenheartSkillManager")) { local T = {}; Root.rawset("LenheartSkillManager", T); } RootTab = Root["LenheartSkillManager"]; local objAddress = L_Sq_GetObjectAddress(obj); local SkillAddress = L_Sq_GetSkillAddress(SkillId); local Key = "EX_LJ" + "SkillAddress" + SkillAddress + "Idx" + Idx; if (RootTab.rawin(Key)) { RootTab.rawset(Key, 0); } else RootTab.rawset(Key, 0); } function HookLevelData(obj, SkillId, Idx) { local RetData = 0; local Root = getroottable(); local RootTab; if (!Root.rawin("LenheartSkillManager")) { local T = {}; Root.rawset("LenheartSkillManager", T); } RootTab = Root["LenheartSkillManager"]; local objAddress = L_Sq_GetObjectAddress(obj); local SkillAddress = L_Sq_GetSkillAddress(SkillId); local Key = "EX_LJ" + "SkillAddress" + SkillAddress + "Idx" + Idx; if (RootTab.rawin(Key)) { RetData += RootTab[Key]; } if (!Root.rawin("LenheartTalismanSkillManager")) { local T = {}; Root.rawset("LenheartTalismanSkillManager", T); } RootTab = Root["LenheartTalismanSkillManager"]; if (RootTab.rawin(Key)) { RetData += RootTab[Key]; } return RetData; } }