/* 文件名:SoulSalvation.nut 路径:Project/SoulSalvation/SoulSalvation.nut 创建日期:2026-01-20 03:00 文件用途:灵魂救赎武器 */ class SoulSalvationC extends Rindro_BaseToolClass { //灵魂救赎武器标识 (阶段1) Equipment1List = null; //1阶段所需灵魂数量 Stage1SoulCount = 1000; //灵魂救赎武器标识 (阶段2) Equipment2List = null; //灵魂救赎武器标识 (阶段3) Equipment3List = null; //三阶段灵魂石对应APC Equipment3SoulStone = null; Img = Rindro_Image("soulweapon/main.img"); //灵魂数据 EquipData = null; //APC数据 ApcInfo = null; constructor() { Equipment1List = {}; Equipment2List = {}; Equipment3List = {}; Equipment3SoulStone = {}; EquipData = {}; ApcInfo = {}; InifPvf(); local ItemDrawControl = getroottable()["NewItemInfoWindow_Obj"]; ItemDrawControl.AddDelegate("灵魂救赎武器代理一阶段", 28, Delegate1.bindenv(this), function(Item) { return Equipment1List.rawin(Item.GetIndex()); }.bindenv(this)); ItemDrawControl.AddDelegate("灵魂救赎武器代理二阶段", 42, Delegate2.bindenv(this), function(Item) { return Equipment2List.rawin(Item.GetIndex()); }.bindenv(this)); ItemDrawControl.AddDelegate("灵魂救赎武器代理三阶段", 42, Delegate3.bindenv(this), function(Item) { return Equipment3List.rawin(Item.GetIndex()); }.bindenv(this)); foreach(Id, _f in Equipment3SoulStone) { ItemDrawControl.AddHookItemId(Id); } ItemDrawControl.AddDelegate("灵魂救赎灵魂石代理", 160, Delegate4.bindenv(this), function(Item) { return Equipment3SoulStone.rawin(Item.GetIndex()); }.bindenv(this)); //上线获取全身灵魂武器灵魂数 Pack_Control.rawset(21011002, function(Chunk) { local Jso = Json.Decode(Chunk); EquipData = Jso.Info; }.bindenv(this)); //多个灵魂武器的补充信息包 Pack_Control.rawset(21011006, function(Chunk) { local Jso = Json.Decode(Chunk); foreach(index, value in Jso.Info) { EquipData[index.tostring()] <- value; } }.bindenv(this)); //单个灵魂武器的刷新信息 Pack_Control.rawset(21011004, function(Chunk) { local Jso = Json.Decode(Chunk); EquipData[Jso.uuid.tostring()] <- Jso.info; }.bindenv(this)); SendPackEx({ op = 21011001 }) //创建灵魂武器升级窗口 LenheartNewUI_CreateWindow(SoulSalvation_UpgradeC, "灵魂武器升级窗口", ((getroottable().Rindro_Scr_Width - 700) / 2).tointeger(), 160, 292, 290, 28); LenheartNewUI_CreateWindow(SoulSalvation_EnchantC, "灵魂武器附灵窗口", ((getroottable().Rindro_Scr_Width - 700) / 2).tointeger(), 160, 292, 290, 28); } //1阶段的代理 function Delegate1(X, Y, Item) { L_sq_DrawCode("灵魂救赎阶段: 1 / 3", X + 6, Y + 15, sq_RGBA(255, 0, 240, 255), 0, 1); L_sq_DrawCode("封印灵魂数: ", X + 6, Y + 30, sq_RGBA(104, 213, 237, 255), 0, 1); local Uuid = Item.GetUuid().tostring(); //获取封印灵魂数 local Count = 0; if (EquipData.rawin(Uuid)) { Count = EquipData[Uuid].soul_count; } local Rate = Count.tofloat() / Stage1SoulCount.tofloat(); L_sq_DrawCode(format("%.1f%%", Rate * 100.0), X + 180, Y + 30, sq_RGBA(255, 119, 0, 255), 0, 1); Img.DrawPng(0, X + 70, Y + 34); setClip(X + 72, Y + 36, X + 72 + (Rate * 97.0).tointeger(), Y + 40); //开始裁切 Img.DrawPng(1, X + 72, Y + 36); releaseClip(); //裁切结束 } //2阶段的代理 function Delegate2(X, Y, Item) { L_sq_DrawCode("灵魂救赎阶段: 2 / 3", X + 6, Y + 15, 0xFF0055FF, 0, 1); L_sq_DrawCode("佩戴释魂通关镇魂曲地区副本", X + 6, Y + 30, 0xFF0055FF, 0, 1); L_sq_DrawCode("即可救赎沉沦无尽永恒的灵魂!", X + 6, Y + 45, 0xFF0055FF, 0, 1); } //3阶段的代理 function Delegate3(X, Y, Item) { L_sq_DrawCode("灵魂救赎阶段: 3 / 3", X + 6, Y + 15, 0xFF0055FF, 0, 1); L_sq_DrawCode("已附灵的不朽灵魂:", X + 6, Y + 30, 0xFF0055FF, 0, 1); local Uuid = Item.GetUuid().tostring(); local APCId = 0; if (EquipData.rawin(Uuid)) { APCId = EquipData[Uuid].soul_id; } if (APCId == 0) { L_sq_DrawCode("未定名", X + 6, Y + 45, 0xFF0055FF, 0, 1); } else { local ApcName = GetApcInfo(APCId).Name; L_sq_DrawCode("Lv.85 " + ApcName, X + 6, Y + 45, 0xFF0055FF, 0, 1); } } //灵魂石的代理 function Delegate4(X, Y, Item) { local ApcId = 0; if (Equipment3SoulStone.rawin(Item.GetIndex())) { ApcId = Equipment3SoulStone[Item.GetIndex()]; } if (ApcId > 0) { local Info = GetApcInfo(ApcId); if (!Info.rawin("Ani")) { Info.Ani <- Rindro_Draw_Character(Info.Job, Info.Equ, "rest.ani", null); } L_sq_DrawCode("不朽的灵魂: " + Info.Name, X + 6, Y + 15, 0xFF0055FF, 0, 1); Info.Ani.Draw(X + 102, Y + 160); } } //读取配置 function InifPvf() { Rindro_Script.GetFileData("etc/rindro/expandequipment/soulsalvation.etc", function(DataTable, Data) { while (!Data.Eof()) { local Fragment = Data.Get(); if (Fragment == "[EQUIPMENT1]") { Equipment1List = {}; while (true) { local Fbuf = Data.Get(); if (Fbuf == "[/EQUIPMENT1]") { break; } Equipment1List.rawset(Fbuf, true); } } else if (Fragment == "[EQUIPMENT2]") { Equipment2List = {}; while (true) { local Fbuf = Data.Get(); if (Fbuf == "[/EQUIPMENT2]") { break; } Equipment2List.rawset(Fbuf, true); } } else if (Fragment == "[EQUIPMENT3]") { Equipment3List = {}; while (true) { local Fbuf = Data.Get(); if (Fbuf == "[/EQUIPMENT3]") { break; } Equipment3List.rawset(Fbuf, true); } } else if (Fragment == "[STAGE1 VALUE]") { Stage1SoulCount = Data.Get(); } else if (Fragment == "[STAGE2 SOULSTONE]") { Equipment3SoulStone = {}; while (true) { local Fbuf = Data.Get(); if (Fbuf == "[/STAGE2 SOULSTONE]") { break; } Equipment3SoulStone.rawset(Fbuf, Data.Get()); } } } }); } //读取APC名字 function GetApcInfo(ApcIndex) { if (ApcInfo.rawin(ApcIndex)) return ApcInfo[ApcIndex]; local Path = "aicharacter/" + R_Utils.GetApcPath(ApcIndex); local Info = Rindro_Script.GetFileData(Path, function(DataTable, Data) { while (!Data.Eof()) { local Fragment = Data.Get(); if (Fragment == "[minimum info]") { DataTable.Name <- Sq_ConvertWideChar(Data.Get(), "big5"); DataTable.Job <- Data.Get(); } else if (Fragment == "[equipment]") { DataTable.Equ <- []; while (true) { local Fbuf = Data.Get(); if (Fbuf == "[/equipment]") { break; } Data.Get(); Data.Get(); DataTable.Equ.append(Fbuf); } } } }); ApcInfo.rawset(ApcIndex, Info); return Info; } } function Lenheart_SoulSalvation_Fun(obj) { local RootTab = getroottable(); if (!RootTab.rawin("SoulSalvation_Obj")) { RootTab.rawset("SoulSalvation_Obj", SoulSalvationC()); } if (KeyPressNB.isKeyPress(OPTION_HOTKEY_PAUSE_IN_TOWER, "asdasd")) { local os = sq_CreateAICharacter(21435); // foreach(member, val in os.getclass()) { // ::print(member + "\n"); // local attr; // if ((attr = os.getclass().getattributes(member)) != null) { // foreach(i, v in attr) { // // ::print("\t" + i + " = " + (typeof v) + "\n"); // } // } else { // // ::print("\t\n") // } // } // local os = sq_CreateAICharacter(21435); os.setCurrentPos(obj.getXPos() + 100, obj.getYPos(), 600); os.setMaster(obj); os.setMapFollowParent(obj); os.setMapFollowType(1); // sq_SetKeyxEnable(obj, E_ATTACK_COMMAND, true); sq_AddObject(obj, os, OBJECTTYPE_CHARACTER, false); } } getroottable()["LenheartFuncTab"].rawset("SoulSalvationFuncN", Lenheart_SoulSalvation_Fun); L_Windows_List <- []; getroottable().rawdelete("LenheartPluginsInitFlag"); getroottable().rawdelete("EventList_Obj") getroottable().rawdelete("SoulSalvation_Obj"); getroottable().rawdelete("L_Each_Obj");