添加示例项目
This commit is contained in:
11
示例项目/进入副本自动修理装备/Proj.ifo
Normal file
11
示例项目/进入副本自动修理装备/Proj.ifo
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"ProjectName": "进入副本自动修理装备",
|
||||
"ProjectDescribe": "进入副本时自动修理穿戴栏的装备耐久度,可设置持有指定契约才修理",
|
||||
"ProjectAuthor": "南瓜",
|
||||
"ProjectVersion": 1.1,
|
||||
"ProjectConfig": "自动修理装备配置_nangua.json",
|
||||
"ProjectFiles": [
|
||||
"进入副本自动修理装备.nut"
|
||||
],
|
||||
"ProjectRunFunc": "_Dps_RepairEquipment_Main_"
|
||||
}
|
||||
12
示例项目/进入副本自动修理装备/自动修理装备配置_nangua.json
Normal file
12
示例项目/进入副本自动修理装备/自动修理装备配置_nangua.json
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"自动修理装备开关(true开启/false关闭)":true,
|
||||
"指定契约才可修理(true开启/false关闭)":true,
|
||||
"契约ID":12,
|
||||
"是否开启修理后发送提示(true开启/false关闭)":true,
|
||||
"是否返还修理费用(true返还/false不返还)":true,
|
||||
"修理成功提示":"[自动维修]您的装备已自动修理完毕",
|
||||
"修理失败提示":"[自动维修]金币不足, 自动修理失败",
|
||||
"修理部分装备提示":"[自动维修]因金币余额不足已维修部分装备",
|
||||
"发送信息播报位置":1,
|
||||
"提示":"如果指定契约关闭,则无条件修理,已知黑钻契约ID为12"
|
||||
}
|
||||
156
示例项目/进入副本自动修理装备/进入副本自动修理装备.nut
Normal file
156
示例项目/进入副本自动修理装备/进入副本自动修理装备.nut
Normal 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();
|
||||
}
|
||||
Reference in New Issue
Block a user