/* 文件名:Achievement.nut 路径:Project/Achievement/Achievement.nut 创建日期:2025-02-23 08:37 文件用途:成就系统 */ class Yosin_DragButton extends LenheartNewUI_CommonUi { State = 0; BaseIdx = 29; DHeight = null; // 改为高度 Path = "interface/lenheartwindowcommon.img"; Idx = 172; FillHeight = 2; // 改为填充高度 FirstHeight = 7; // 改为首节高度 Width = 9; // 固定宽度,垂直按钮宽度通常是固定的 Visible = true; DeBugMode = false; BasePos = null; MoveFlag = false; //鼠标相对位置 M_Xpos = null; M_Ypos = null; B_X = null; B_Y = null; Move_Value = 0; Max_Move_Value = 0; CurrentMovePosY = 0; constructor(X, Y, H) { this.DHeight = H; LenheartNewUI_CommonUi.constructor(X, Y, Width, H + 7 * 2); // 宽度固定,高度动态 BasePos = { x = X, y = Y } } function SetFrame(gPath, gIdx) { if (gPath) Path = gPath; Idx = gIdx; } function Show(obj) { //不可用 if (State == 8) { L_sq_Draw3Image_Vertical(X + 1, Y, this.DHeight, Path, Idx + 9, FillHeight, FirstHeight); } else { //按下 if (isLBDown) { L_sq_Draw3Image_Vertical(X, Y + 1, this.DHeight, Path, Idx + 3, FillHeight, FirstHeight); } //悬停 else if (isInRect) { L_sq_Draw3Image_Vertical(X, Y, this.DHeight, Path, Idx + 3, FillHeight, FirstHeight); } //普通 else { L_sq_Draw3Image_Vertical(X, Y, this.DHeight, Path, Idx, FillHeight, FirstHeight); } } } //鼠标左键按下回调 function OnMouseLbDown(MousePos_X, MousePos_Y) { LenheartNewUI_CommonUi.OnMouseLbDown(MousePos_X, MousePos_Y); if (isInRect) { MoveFlag = true; M_Xpos = MousePos_X; //原始鼠标位置数据 M_Ypos = MousePos_Y; B_X = X; //原始窗口位置 B_Y = Y; } } //鼠标事件回调 function OnMouseProc(Flag, MousePos_X, MousePos_Y) { LenheartNewUI_CommonUi.OnMouseProc(Flag, MousePos_X, MousePos_Y); //移动 if (MoveFlag) { Move_Value = MousePos_Y - M_Ypos + CurrentMovePosY; print(Move_Value); if ( Move_Value <= (Max_Move_Value - Height + BasePos.y)) { Y = (Move_Value); Localtion_Y = (BasePos.y + Move_Value); } } } //鼠标左键弹起回调 function OnMouseLbUp(MousePos_X, MousePos_Y) { LenheartNewUI_CommonUi.OnMouseLbUp(MousePos_X, MousePos_Y); MoveFlag = false; CurrentMovePosY = Move_Value; //记录当前移动位置 } //设置最大移动值 function SetMaxMoveValue(Value) { Max_Move_Value = Value; } } // class Yosin_DragButton extends LenheartNewUI_CommonUi { // //路径 // Path = ""; // //索引 // Idx = 0; // //方向 // Direction = false; // //按钮 // Button = null; // //变动位置回调函数 // OnChange = null; // //鼠标相对位置 // M_Xpos = null; // M_Ypos = null; // //未移动时的初始坐标 // BasePos = null; // //移动Flag // MoveFlag = false; // //最大移动值 // Max_Move_Value = 0; // //移动值 // Move_Value = 0; // //侦测值 // Detect_Value = 0; // B_X = null; // B_Y = null; // Visible = true; // DeBugMode = false; // constructor(X, Y, S_H, H) { // Childrens = []; // this.Path = Path; // this.Idx = Idx; // LenheartNewUI_CommonUi.constructor(X, Y, 9, H); // Button = LenheartNewUI_VerticalButton(X, Y, S_H); // Button.SetFrame("interface/lenheartwindowcommon.img", 184); // AddChild(Button); // BasePos = { // x = X, // y = Y // } // } // //生成DT // function GenerateDt() { // try { // local CurT = L_Getmicroseconds(); // Duration = (CurT - DurationFlag); // DurationFlag = CurT; // } catch (exception) { // } // } // function DeBug(obj) { // sq_DrawBox(X, Y, Width, Height, 0xffffffff); // } // function Show(obj) { // LenheartNewUI_Windows.Show(obj); // } // //同步坐标 // function SyncPos(X, Y) { // this.X = X; // this.Y = Y; // foreach(Window in Childrens) { // Window.SyncPos(X, Y); // } // } // //鼠标事件回调 // function OnMouseProc(Flag, MousePos_X, MousePos_Y) { // LenheartNewUI_CommonUi.OnMouseProc(Flag, MousePos_X, MousePos_Y); // if (sq_IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, Parent.X + Button.Localtion_X , Parent.Y + Button.Localtion_Y, Width, Height)){ // isInRect = true; // } // else isInRect = false; // foreach(Window in Childrens) { // Window.OnMouseProc(Flag, MousePos_X, MousePos_Y); // } // //移动 // if (MoveFlag) { // //左键拖动 // if (Direction) { // Move_Value = B_X + (MousePos_X - M_Xpos); // if (!(Move_Value >= (0 + BasePos.x) && Move_Value <= (Max_Move_Value - Width + BasePos.x))) { // X = Move_Value; // // DragLogic((Move_Value - Localtion_X).tofloat() / (Max_Move_Value - Width + BasePos.x - Localtion_X).tofloat()); // } // } else { // Move_Value = B_Y + (MousePos_Y - M_Ypos); // if (Move_Value >= (0 + BasePos.y) && Move_Value <= (Max_Move_Value - Height + BasePos.y)) { // Y = (Move_Value); // Button.Localtion_Y = (Move_Value); // // DragLogic((Move_Value - Localtion_Y).tofloat() / (Max_Move_Value - Height + BasePos.y - Localtion_Y).tofloat()); // } // } // SyncPos(X, Y); // } // } // //鼠标左键按下回调 // function OnMouseLbDown(MousePos_X, MousePos_Y) { // LenheartNewUI_CommonUi.OnMouseLbDown(MousePos_X, MousePos_Y); // foreach(Window in Childrens) { // Window.OnMouseLbDown(MousePos_X, MousePos_Y); // } // if (isInRect) { // MoveFlag = true; // M_Xpos = MousePos_X; //原始鼠标位置数据 // M_Ypos = MousePos_Y; // B_X = X; //原始窗口位置 // B_Y = Y; // } // } // //鼠标左键弹起回调 // function OnMouseLbUp(MousePos_X, MousePos_Y) { // LenheartNewUI_CommonUi.OnMouseLbUp(MousePos_X, MousePos_Y); // foreach(Window in Childrens) { // Window.OnMouseLbUp(MousePos_X, MousePos_Y); // } // MoveFlag = false; // } // //鼠标右键按下回调 // function OnMouseRbDown(MousePos_X, MousePos_Y) { // LenheartNewUI_CommonUi.OnMouseRbDown(MousePos_X, MousePos_Y); // foreach(Window in Childrens) { // Window.OnMouseRbDown(MousePos_X, MousePos_Y); // } // } // //鼠标右键弹起回调 // function OnMouseRbUp(MousePos_X, MousePos_Y) { // LenheartNewUI_CommonUi.OnMouseRbUp(MousePos_X, MousePos_Y); // foreach(Window in Childrens) { // Window.OnMouseRbUp(MousePos_X, MousePos_Y); // } // } // //鼠标滚轮时间回调 // function OnMouseWheel(Flag, MousePos_X, MousePos_Y) { // LenheartNewUI_CommonUi.OnMouseWheel(Flag, MousePos_X, MousePos_Y); // foreach(Window in Childrens) { // Window.OnMouseWheel(Flag, MousePos_X, MousePos_Y); // } // } // //设置最大移动值 // function SetMaxMoveValue(Value) { // Max_Move_Value = Value; // } // } class AchievementC extends LenheartNewUI_Windows { //调试模式 // DeBugMode = true; //不是窗口 // NoWindow = true; //是否可见 // Visible = false; EtcInfo = null; WindowImg = Rindro_Image("achievement/main.img"); WindowBackGroundImg = Rindro_Image("achievement/mainbackground.img"); ButtonInfo = null; Info = null; Data = null; IsOther = false; OtherName = null; Page = 1; //滚轮值 ScrollValue = 0; ScrollValueMax = 500; EventWindow = null; //查询成就回包 function OnQueryAchievementBack(Chunk) { local Jso = Json.Decode(Chunk); if (Jso.rawin("click")) { IsOther = true; } else IsOther = false; Data = {}; foreach(ValueObject in Jso.Achievement) { Data.rawset(ValueObject.id, ValueObject); } } function OnQueryAchievementBack2(Chunk) { local Jso = Json.Decode(Chunk); EventWindow = EventList_Obj.AddEvent("AchievementEvent1", 682, null); EventWindow.MainButton.ShowName = Jso.VipInfo; } function OnQueryAchievementBack3(Chunk) { local Jso = Json.Decode(Chunk); EventWindow = EventList_Obj.AddEvent("人物属性加成", 433, null); EventWindow.MainButton.OnClick = function(B_obj) { local T = { op = 20091601, } SendPackEx(T); }.bindenv(this); } //查询成就 function QueryAchievement() { local T = { op = 20091001, cjid = Page, cid2 = OtherName ? OtherName : "-1" } SendPackEx(T); } constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) { Childrens = []; InitButtonConfig(); //注册控件 RegisterWidget(); LenheartNewUI_Windows.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH); Pack_Control.rawset(20091002, OnQueryAchievementBack.bindenv(this)); Pack_Control.rawset(20092002, OnQueryAchievementBack2.bindenv(this)); Pack_Control.rawset(20091010, OnQueryAchievementBack3.bindenv(this)); InitConfig(); InitAchievement(); QueryAchievement(); EventWindow = EventList_Obj.AddEvent("人物属性加成", 433, null); EventWindow.MainButton.OnClick = function(B_obj) { local T = { op = 20091601, } SendPackEx(T); }.bindenv(this); } function InitAchievement() { Childrens = []; ScrollValueMax = 0; RegisterWidget(); if (Info.len() > Page) { //绘制成就 foreach(InfoObj in Info[Page]) { if (InfoObj.Pos.y - 320 > ScrollValueMax) ScrollValueMax = InfoObj.Pos.y - 320; DrawAItem(InfoObj); } } } function InitButtonConfig() { local AchieData = R_Utils.GetScriptFileReader("etc/th_plugin/control.etc"); if (AchieData) { local DataArr = []; if (AchieData.Size >= 7) { //创建Blob对象 local IOBUF = Sq_Point2Blob(L_sq_P2I(AchieData.Buffer.C_Object), AchieData.Size); local IO = BlobEx(IOBUF.readblob(IOBUF.len())); //以5为单步从第二位开始遍历字节 local i = 2; while (true) { if (i< AchieData.Size && AchieData.Size - i >= 5) { local str = Rindro_Script.UnpackData(IO, i); i += 5; //城镇编号 if (str == "[info]") { local Data = {}; while (true) { local Ret = Rindro_Script.UnpackData(IO, i); i += 5; if (Ret == "[/info]") { DataArr.append(Data); break; } if (Ret == "[icon]") { Data.Icon <- {}; Data.Icon.Path <- Rindro_Script.UnpackData(IO, i).tolower(); i += 5; Data.Icon.Idx <- Rindro_Script.UnpackData(IO, i); i += 5; } if (Ret == "[pos]") { Data.Pos <- {}; Data.Pos.x <- Rindro_Script.UnpackData(IO, i); i += 5; Data.Pos.y <- Rindro_Script.UnpackData(IO, i); i += 5; } if (Ret == "[size]") { Data.Size <- {}; Data.Size.x <- Rindro_Script.UnpackData(IO, i); i += 5; Data.Size.y <- Rindro_Script.UnpackData(IO, i); i += 5; } } } } else break; } } ButtonInfo = DataArr; } } function InitConfig() { Info = []; local PageLst = R_Utils.GetLstArr("etc/th_plugin/info.lst", "etc/"); foreach(Index, Path in PageLst) { local AchieData = R_Utils.GetScriptFileReader(Path); if (AchieData) { local DataArr = {}; if (AchieData.Size >= 7) { //创建Blob对象 local IOBUF = Sq_Point2Blob(L_sq_P2I(AchieData.Buffer.C_Object), AchieData.Size); local IO = BlobEx(IOBUF.readblob(IOBUF.len())); //以5为单步从第二位开始遍历字节 local i = 2; while (true) { if (i< AchieData.Size && AchieData.Size - i >= 5) { local str = Rindro_Script.UnpackData(IO, i); i += 5; //城镇编号 if (str == "[info]") { local Data = {}; while (true) { local Ret = Rindro_Script.UnpackData(IO, i); i += 5; if (Ret == "[/info]") { DataArr.rawset(Data.Id, Data); break; } if (Ret == "[id]") { Data.Id <- Rindro_Script.UnpackData(IO, i); i += 5; } if (Ret == "[icon]") { Data.Icon <- {}; Data.Icon.Path <- Rindro_Script.UnpackData(IO, i).tolower(); i += 5; Data.Icon.Idx <- Rindro_Script.UnpackData(IO, i); i += 5; } if (Ret == "[pos]") { Data.Pos <- {}; Data.Pos.x <- Rindro_Script.UnpackData(IO, i); i += 5; Data.Pos.y <- Rindro_Script.UnpackData(IO, i); i += 5; } if (Ret == "[size]") { Data.Size <- {}; Data.Size.x <- Rindro_Script.UnpackData(IO, i); i += 5; Data.Size.y <- Rindro_Script.UnpackData(IO, i); i += 5; } if (Ret == "[str]") { Data.Str <- []; while (true) { local strbuffer = Rindro_Script.UnpackData(IO, i); i += 5; strbuffer = Sq_ConvertWideChar(strbuffer, "big5") if (strbuffer == "[/str]") break; Data.Str.append(strbuffer); } } } } } else break; } } Info.append(DataArr); } } } function RegisterWidget() { //类型按钮 for (local i = 0; i< ButtonInfo.len(); i++) { local Config = ButtonInfo[i]; local TypeButton = LenheartNewUI_BaseButton(Config.Pos.x, Config.Pos.y, Config.Size.x, Config.Size.y, Config.Icon.Path, Config.Icon.Idx); TypeButton.Data = i; TypeButton.OnClickEx = function(Button) { Page = Button.Data; InitAchievement(); QueryAchievement(); }.bindenv(this); Childrens.append(TypeButton); } // local TestButton = Yosin_DragButton(50, 120, 10); // TestButton.SetFrame("interface/lenheartwindowcommon.img", 184); // TestButton.SetMaxMoveValue(400); // AddChild(TestButton); // Childrens.append(TestButton); } //绘制主界面 function DrawMain(obj) { WindowBackGroundImg.DrawPng(0 + Page, X, Y); WindowImg.DrawPng(19, X + EtcInfo.closebutton_pos[0], Y + EtcInfo.closebutton_pos[1]); //关闭按钮图标 } function DrawInfo() { if (Info.len() > Page) { //绘制成就 foreach(InfoObj in Info[Page]) { if (sq_IsIntersectRect(IMouse.GetXPos(), IMouse.GetYPos(), 1, 1, X + InfoObj.Pos.x, Y + InfoObj.Pos.y - ScrollValue, InfoObj.Size.x, InfoObj.Size.y)) { for (local i = 0; i< InfoObj.Str.len(); i += 2) { local OffsetRate = InfoObj.Str.len() / 2; local StrBuffer = format(InfoObj.Str[i], Data[InfoObj.Id].num); local StrBuffer2 = InfoObj.Str[i + 1]; L_sq_DrawWindow(IMouse.GetXPos() + 32, IMouse.GetYPos() + 60 - (OffsetRate * 44) + (i / 2 * 44), 144, 24, "interface/lenheartwindowcommon.img", 97, 11, 12, 11, 13); L_sq_DrawCode(StrBuffer, IMouse.GetXPos() + 42, IMouse.GetYPos() + 70 - (OffsetRate * 44) + (i / 2 * 44), (Data[InfoObj.Id].achievement > (i / 2)) ? 0xFFedd568 : 0xFF969696, 1, 1); L_sq_DrawCode(StrBuffer2, IMouse.GetXPos() + 42, IMouse.GetYPos() + 88 - (OffsetRate * 44) + (i / 2 * 44), (Data[InfoObj.Id].achievement > (i / 2)) ? 0xFFedd568 : 0xFF969696, 1, 1); } } } } } function Show(obj) { DrawMain(obj); setClip(X + EtcInfo.clicp_pos[0], Y + EtcInfo.clicp_pos[1], X + EtcInfo.clicp_pos[2], Y + EtcInfo.clicp_pos[3]); LenheartNewUI_Windows.Show(obj); releaseClip(); //裁切结束 DrawInfo(); } function DrawAItem(InfoObj) { local Button = LenheartNewUI_BaseButton(InfoObj.Pos.x, InfoObj.Pos.y, InfoObj.Size.x, InfoObj.Size.y, InfoObj.Icon.Path, InfoObj.Icon.Idx); Button.Data = InfoObj; Button.SetCallBackFunc(function(Button) { local InfoObj = Button.Data; Button.Localtion_X = InfoObj.Pos.x; Button.Localtion_Y = InfoObj.Pos.y - ScrollValue; }.bindenv(this)); Button.OnClickEx = function(Button) { if (IsOther) return; local T = { op = 20091005, cjid = Page, id = Button.Data.Id } SendPackEx(T); }.bindenv(this); Childrens.append(Button); } RegisFlag = false; //逻辑入口 function Proc(obj) { LenheartNewUI_Windows.SyncPos(X, Y); local RootTab = getroottable(); if (RootTab.rawin("L_PlayerEach_Obj") && RegisFlag == false) { RegisFlag = true; RootTab["L_PlayerEach_Obj"].AddEachForCommon("查看收集信息", function(SThis) { //关闭按钮 local ApplyEngagementButton = LenheartNewUI_Each_BaseButton(0, 0, 100, 21, "interface2/popup_menu/popup_back.img", 3); ApplyEngagementButton.Icon = "interface2/popup_menu/popup_icon_cn.img"; ApplyEngagementButton.IconIdx = 58; ApplyEngagementButton.Str = "查看收集信息"; ApplyEngagementButton.OnClick = function(Button) { if (L_Sq_GetPlayerEachName().len() <= 0 || L_Sq_GetPlayerEachName() == L_Sq_GetObjectName(sq_GetMyMasterCharacter())) { } else { OtherName = L_Sq_GetPlayerEachName(); Visible = true; InitAchievement(); QueryAchievement(); } Button.Parent.CloseAllEach(); }.bindenv(this); ApplyEngagementButton.SetCallBackFunc(function(Button) {}) SThis.AddChild(ApplyEngagementButton); }.bindenv(this)); } } //override //鼠标滚轮事件回调 function OnMouseWheel(Flag, MousePos_X, MousePos_Y) { if (Flag) { if (ScrollValue > 0) ScrollValue -= 35; } if (!Flag) { if (ScrollValue< ScrollValueMax) ScrollValue += 35; } //调用原生方法 LenheartNewUI_Windows.OnMouseWheel(Flag, MousePos_X, MousePos_Y); } //override //鼠标左键按下回调 function OnMouseLbDown(MousePos_X, MousePos_Y) { if (sq_IsIntersectRect(IMouse.GetXPos(), IMouse.GetYPos(), 1, 1, X + EtcInfo.closebutton_pos[0], Y + EtcInfo.closebutton_pos[1], EtcInfo.closebutton_pos[2], EtcInfo.closebutton_pos[3])) { CloseWindow(); } LenheartNewUI_Windows.OnMouseLbDown(MousePos_X, MousePos_Y); } function OpenCallBack() { Visible = true; IsOther = false; OtherName = null; InitAchievement(); QueryAchievement(); } } L_Windows_List <- []; getroottable().rawdelete("LenheartPluginsInitFlag"); getroottable().rawdelete("EventList_Obj") getroottable().rawdelete("Achievement_Obj"); function Lenheart_Achievement_Fun(obj) { local RootTab = getroottable(); if (!RootTab.rawin("Achievement_Obj")) { RootTab.rawset("Achievement_Obj", true); local Info = Rindro_Script.GetFileData("etc/th_plugin/etc.etc", function(DataTable, Data) { while (!Data.Eof()) { local Str = Data.Get(); if (Str == "[window pos]") { DataTable.window_pos <- [Data.Get(), Data.Get(), Data.Get(), Data.Get(), Data.Get()]; } else if (Str == "[clicp pos]") { DataTable.clicp_pos <- [Data.Get(), Data.Get(), Data.Get(), Data.Get()]; } else if (Str == "[closebutton pos]") { DataTable.closebutton_pos <- [Data.Get(), Data.Get(), Data.Get(), Data.Get()]; } } }.bindenv(this)); local window_Info = Info.window_pos; local Win = LenheartNewUI_CreateWindow(AchievementC, "成就系统窗口", window_Info[0], window_Info[1], window_Info[2], window_Info[3], window_Info[4]); Win.EtcInfo = Info; EventList_Obj.AddEvent("成就系统", 118, Win); } } getroottable()["LenheartFuncTab"].rawset("AchievementFuncN", Lenheart_Achievement_Fun);