504 lines
20 KiB
Plaintext
504 lines
20 KiB
Plaintext
/*
|
|
文件名:Achievement.nut
|
|
路径:Project/Achievement/Achievement.nut
|
|
创建日期:2025-02-23 08:37
|
|
文件用途:成就系统
|
|
*/
|
|
|
|
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); |