/* 文件名:Achievement.nut 路径:Project/Achievement/Achievement.nut 创建日期:2025-02-23 08:37 文件用途:成就系统 */ return; class Achievement_TypeButton extends LenheartNewUI_BaseButton { function _typeof() { return "Achievement_TypeButton"; } } 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; //左侧滚动条对象 LeftScrollBar = null; //左侧滚轮值 LeftScrollRate = 0; LeftScrollValue = 400; //右侧滚动条对象 RightScrollBar = null; //右侧滚轮值 RightScrollRate = 0; RightScrollValue = 400; //查询成就回包 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) { EtcInfo = 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 == "[clicp2 pos]") { DataTable.clicp_pos2 <- [Data.Get(), Data.Get(), Data.Get(), Data.Get()]; }else if (Str == "[closebutton pos]") { DataTable.closebutton_pos <- [Data.Get(), Data.Get(), Data.Get(), Data.Get()]; } else if (Str == "[left scroll bar]") { DataTable.left_scroll_bar_info <- [Data.Get(), Data.Get(), Data.Get(), Data.Get(), Data.Get(), Data.Get()]; } else if (Str == "[right scroll bar]") { DataTable.right_scroll_bar_info <- []; while (true) { local buf = Data.Get(); if (buf == "[/right scroll bar]") break; local Arr = [buf,Data.Get(), Data.Get(), Data.Get(), Data.Get(), Data.Get()]; DataTable.right_scroll_bar_info.append(Arr); } } } }.bindenv(this)); Childrens = []; InitButtonConfig(); //注册控件 RegisterWidget(true); 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() { for (local i = 0; i< Childrens.len(); i++) { if (typeof Childrens[i] == "Achievement_TypeButton") { Childrens.remove(i); i--; } } //这里要手动移除右边的滚动条 if (RightScrollBar) RightScrollBar.RemoveSelf(); ScrollValueMax = 0; RegisterWidget(false); if (Info.len() > Page) { //绘制成就 foreach(InfoObj in Info[Page]) { if (InfoObj.Pos.y - 320 > ScrollValueMax) ScrollValueMax = InfoObj.Pos.y - 320; DrawAItem(InfoObj); } RightScrollValue = EtcInfo.right_scroll_bar_info[Page][4]; RightScrollBar = Yosin_ScrollBar(EtcInfo.right_scroll_bar_info[Page][0], EtcInfo.right_scroll_bar_info[Page][1], EtcInfo.right_scroll_bar_info[Page][2], EtcInfo.right_scroll_bar_info[Page][3]); RightScrollBar.SetParent(this); RightScrollBar.SetStep(EtcInfo.right_scroll_bar_info[Page][5].tofloat() / 100.0); RightScrollBar.SetOnChange(function(Rate) { ScrollValue = (Rate * RightScrollValue).tointeger(); }.bindenv(this)); } } 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(Flag) { if (!Flag) { //类型按钮 for (local i = 0; i< ButtonInfo.len(); i++) { local Config = ButtonInfo[i]; local TypeButton = Achievement_TypeButton(Config.Pos.x, Config.Pos.y, Config.Size.x, Config.Size.y, Config.Icon.Path, Config.Icon.Idx); TypeButton.Data = { id = i, BasePosY = Config.Pos.y, }; TypeButton.OnClickEx = function(Button) { if (Button.Localtion_Y <= EtcInfo.clicp_pos[1] || Button.Localtion_Y >= EtcInfo.clicp_pos[3]) return; Page = Button.Data.id; InitAchievement(); QueryAchievement(); }.bindenv(this); TypeButton.SetCallBackFunc(function(Btn) { Btn.Localtion_Y = (Btn.Data.BasePosY - LeftScrollRate * LeftScrollValue).tointeger(); }.bindenv(this)); Childrens.append(TypeButton); } } //只有第一次的时候注册进度条 if (Flag) { LeftScrollValue = EtcInfo.left_scroll_bar_info[4]; LeftScrollBar = Yosin_ScrollBar(EtcInfo.left_scroll_bar_info[0], EtcInfo.left_scroll_bar_info[1], EtcInfo.left_scroll_bar_info[2], EtcInfo.left_scroll_bar_info[3]); LeftScrollBar.SetParent(this); LeftScrollBar.SetStep(EtcInfo.left_scroll_bar_info[5].tofloat() / 100.0); LeftScrollBar.SetOnChange(function(Rate) { LeftScrollRate = Rate; }.bindenv(this)); } } //绘制主界面 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(Y + InfoObj.Pos.y - ScrollValue < EtcInfo.clicp_pos2[1])continue; 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]); //左侧裁切 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(); //裁切结束 //右侧裁切 setClip(X + EtcInfo.clicp_pos2[0], Y + EtcInfo.clicp_pos2[1], X + EtcInfo.clicp_pos2[2], Y + EtcInfo.clicp_pos2[3]); LenheartNewUI_Windows.Show(obj); releaseClip(); //裁切结束 DrawInfo(); } function DrawAItem(InfoObj) { local Button = Achievement_TypeButton(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 (MousePos_X > (X + 205)) { // if (Flag) { // if (ScrollValue > 0) ScrollValue -= 35; // } // if (!Flag) { // if (ScrollValue< ScrollValueMax) ScrollValue += 35; // } if (Flag) RightScrollBar.DoStep(-1); if (!Flag) RightScrollBar.DoStep(1); } else { if (Flag) LeftScrollBar.DoStep(-1); if (!Flag) LeftScrollBar.DoStep(1); } //调用原生方法 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()]; } } }.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]); EventList_Obj.AddEvent("成就系统", 118, Win); } } getroottable()["LenheartFuncTab"].rawset("AchievementFuncN", Lenheart_Achievement_Fun);