1615 lines
53 KiB
Plaintext
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;
|
|
}
|
|
} |