添加示例项目

This commit is contained in:
2026-04-16 16:27:53 +08:00
parent 69a2141804
commit 721fb5a992
192 changed files with 10148 additions and 0 deletions

View File

@@ -0,0 +1,11 @@
{
"ProjectName": "进入副本自动修理装备",
"ProjectDescribe": "进入副本时自动修理穿戴栏的装备耐久度,可设置持有指定契约才修理",
"ProjectAuthor": "南瓜",
"ProjectVersion": 1.1,
"ProjectConfig": "自动修理装备配置_nangua.json",
"ProjectFiles": [
"进入副本自动修理装备.nut"
],
"ProjectRunFunc": "_Dps_RepairEquipment_Main_"
}

View File

@@ -0,0 +1,12 @@
{
"自动修理装备开关(true开启/false关闭)":true,
"指定契约才可修理(true开启/false关闭)":true,
"契约ID":12,
"是否开启修理后发送提示(true开启/false关闭)":true,
"是否返还修理费用(true返还/false不返还)":true,
"修理成功提示":"[自动维修]您的装备已自动修理完毕",
"修理失败提示":"[自动维修]金币不足, 自动修理失败",
"修理部分装备提示":"[自动维修]因金币余额不足已维修部分装备",
"发送信息播报位置":1,
"提示":"如果指定契约关闭,则无条件修理,已知黑钻契约ID为12"
}

View File

@@ -0,0 +1,156 @@
function _Dps_RepairEquipment_Main_() {
Cb_StartGame_check_error_Enter_Func.info <- function (args) {
local config = GlobalConfig.Get("自动修理装备配置_nangua.json");
local SUser = User(args[1]);
if(!config["自动修理装备开关(true开启/false关闭)"]) {
return;
}
local PartyObj = SUser.GetParty();
local needCheckContract = config["指定契约才可修理(true开启/false关闭)"];
if(PartyObj) {
for (local i = 0; i < 4; ++i) {
local TUser = PartyObj.GetUser(i);
if(TUser) {
if(needCheckContract) {
if(_Dps_RepairEquipment.CheckUserPremium(TUser, config["契约ID"])) {
_Dps_RepairEquipment.RepairEquipmentBynangua(TUser);
}
} else {
_Dps_RepairEquipment.RepairEquipmentBynangua(TUser);
}
}
}
} else {
if(needCheckContract) {
if(_Dps_RepairEquipment.CheckUserPremium(SUser, config["契约ID"])) {
_Dps_RepairEquipment.RepairEquipmentBynangua(SUser);
}
} else {
_Dps_RepairEquipment.RepairEquipmentBynangua(SUser);
}
}
}
}
class _Dps_RepairEquipment {
// 检查用户是否拥有指定契约
function CheckUserPremium(SUser, contract_id) {
local premium_ptr = Sq_CallFunc(S_Ptr("0x0812CE28"), "pointer", ["pointer"], SUser.C_Object);
local contract_data_ptr = Sq_CallFunc(S_Ptr("0x086ADF52"), "pointer", ["pointer", "int"], premium_ptr, contract_id);
local VIP = NativePointer(contract_data_ptr).readU32() != 0;
return VIP;
}
function RepairEquipmentBynangua(SUser) {
local config = GlobalConfig.Get("自动修理装备配置_nangua.json");
local InvenObj = SUser.GetInven();
local anyItemRepaired = false;
local current_money = InvenObj.GetMoney();
local need_repair_count = 0;
local repaired_count = 0;
local total_repair_cost = 0;
// 第一次遍历:计算总修理费用和需要修理的装备数量
for (local i = 10; i <= 16; ++i) {
if (i == 11) continue;
local ItemObj = InvenObj.GetSlot(0, i);
if (ItemObj.GetIndex() == 0) continue;
local durability = ItemObj.GetDurable();
local G_CDataManager = Sq_CallFunc(S_Ptr("0x80CC19B"), "pointer", []);
local PVFItemObj = Sq_CallFunc(S_Ptr("0x835FA32"), "pointer", ["pointer", "int"], G_CDataManager, ItemObj.GetIndex());
local durability_max = Sq_CallFunc(S_Ptr("0x811ED98"), "int", ["pointer"], PVFItemObj);
if (durability < durability_max) {
need_repair_count++;
local charac_level = SUser.GetCharacLevel();
local growth_grade = Sq_CallFunc(S_Ptr("0x085137B8"), "int", ["pointer", "int"], PVFItemObj, charac_level);
local growth_repair_cost = Sq_CallFunc(S_Ptr("0x0851381C"), "int", ["pointer", "int"], PVFItemObj, charac_level);
local cost_rate = 1.0;
local repair_cost = Sq_CallFunc(S_Ptr("0x0898C8FC"), "int", ["int", "int", "int", "int", "bool", "float"], growth_repair_cost, durability, durability_max, growth_grade, false, cost_rate);
total_repair_cost += repair_cost;
}
}
if (need_repair_count == 0) return;
// 如果开启了返还功能,先给玩家发放金币
if(config["是否返还修理费用(true返还/false不返还)"]) {
SUser.RechargeMoney(total_repair_cost);
SUser.SendUpdateItemList(1, 0, 0);
current_money = InvenObj.GetMoney(); // 更新当前金币数
}
local msg_base = Memory.alloc(32);
local param_base = Memory.alloc(32);
local dispatcher = Memory.alloc(4);
for (local i = 10; i <= 16; ++i) {
if (i == 11) continue;
local ItemObj = InvenObj.GetSlot(0, i);
if (ItemObj.GetIndex() == 0) continue;
local durability = ItemObj.GetDurable();
local G_CDataManager = Sq_CallFunc(S_Ptr("0x80CC19B"), "pointer", []);
local PVFItemObj = Sq_CallFunc(S_Ptr("0x835FA32"), "pointer", ["pointer", "int"], G_CDataManager, ItemObj.GetIndex());
local durability_max = Sq_CallFunc(S_Ptr("0x811ED98"), "int", ["pointer"], PVFItemObj);
if (durability < durability_max) {
local charac_level = SUser.GetCharacLevel();
local growth_grade = Sq_CallFunc(S_Ptr("0x085137B8"), "int", ["pointer", "int"], PVFItemObj, charac_level);
local growth_repair_cost = Sq_CallFunc(S_Ptr("0x0851381C"), "int", ["pointer", "int"], PVFItemObj, charac_level);
local cost_rate = 1.0;
local repair_cost = Sq_CallFunc(S_Ptr("0x0898C8FC"), "int", ["int", "int", "int", "int", "bool", "float"], growth_repair_cost, durability, durability_max, growth_grade, false, cost_rate);
if (current_money < repair_cost) {
continue;
}
local temp_ptr = msg_base;
temp_ptr = temp_ptr.add(13);
temp_ptr.writeU8(3);
temp_ptr = msg_base.add(14);
temp_ptr.writeU16(i);
temp_ptr = msg_base.add(16);
temp_ptr.writeU16(65535);
temp_ptr = param_base.add(12);
temp_ptr.writeU16(0);
local result = Sq_CallFunc(S_Ptr("0x081C6082"), "int", ["pointer", "pointer", "pointer", "pointer"], dispatcher.C_Object, SUser.C_Object, msg_base.C_Object, param_base.C_Object);
if(result == 0) {
anyItemRepaired = true;
repaired_count++;
SendRepairPacket(SUser, i, durability_max);
current_money -= repair_cost;
}
}
}
if (config["是否开启修理后发送提示(true开启/false关闭)"]) {
if (repaired_count == 0) {
SUser.SendNotiPacketMessage(config["修理失败提示"], config["发送信息播报位置"]);
} else if (repaired_count < need_repair_count) {
SUser.SendNotiPacketMessage(config["修理部分装备提示"], config["发送信息播报位置"]);
} else {
SUser.SendNotiPacketMessage(config["修理成功提示"], config["发送信息播报位置"]);
}
}
}
}
function SendRepairPacket(SUser, slot, durability) {
local Pack = Packet();
Pack.Put_Header(1, 25);
Pack.Put_Byte(1);
local InvenObj = SUser.GetInven();
local Money = InvenObj.GetMoney();
Pack.Put_Int(Money);
Pack.Put_Byte(0);
Pack.Put_Short(slot);
Pack.Put_Short(durability);
Pack.Finalize(true);
SUser.Send(Pack);
Pack.Delete();
}