Sqr/Tool/Tool.nut

1615 lines
53 KiB
Plaintext

// 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;
}
}