class _evilDgnBynangua { function get_required_gradeBynangua(dgn_id, dgn_diff) { local Config = GlobalConfig.Get("抗魔值进入副本配置_Nangua.json"); if (Config["抗魔值进入副本"]["副本配置"].rawin(dgn_id.tostring())) { local requirements = Config["抗魔值进入副本"]["副本配置"][dgn_id.tostring()]; for (local i = 0; i < requirements.len(); i += 2) { if (requirements[i] == dgn_diff) { return requirements[i + 1]; } } } return null; } function api_CDungeon_getDungeonName(dungeon_id) { local G_CDataManager = Sq_CallFunc(S_Ptr("0x80CC19B"), "pointer", []); local cdungeon = Sq_CallFunc(S_Ptr("0x835F9F8"), "pointer", ["pointer", "int"], G_CDataManager, dungeon_id); if (!cdungeon) { return; } if (cdungeon) { local dgnobj = Sq_CallFunc(S_Ptr("0x81455A6"), "pointer", ["pointer"], cdungeon); local name = NativePointer(dgnobj).readUtf8String(); return name; } return null; } function join(array, delimiter) { local result = ""; for (local i = 0; i < array.len(); ++i) { if (i > 0) { result += delimiter; } result += array[i]; } return result; } } getroottable()._Nangua_EquipmentData_List_ <- {}; getroottable()._Nangua_EquipmentData_Anti_ <- {}; function _Nangua_GetEquipmentData_Anti_(Equipment_id) { try { //如果数据存在 返回数据 if (getroottable()._Nangua_EquipmentData_Anti_.rawin(Equipment_id))return getroottable()._Nangua_EquipmentData_Anti_[Equipment_id]; //通过装备ID获取装备路径 local Path = getroottable()._Nangua_EquipmentData_List_[Equipment_id]; Path = "equipment/" + Path; //读取装备数据 local Data = ScriptData.GetFileData(Path, function(DataTable, Data) { while (!Data.Eof()) { local Key = Data.Get(); if (Key == "[anti evil]") { getroottable()._Nangua_EquipmentData_Anti_[Equipment_id] <- Data.Get(); return getroottable()._Nangua_EquipmentData_Anti_[Equipment_id]; } } }); } catch (exception){ } return 0; } function _Dps_anti_evilDgnBynangua_Main_() { local Config = GlobalConfig.Get("抗魔值进入副本配置_Nangua.json"); Script(Config["PVF储存路径_没有更改的话不要改动此配置"]); //if (Config["PVF储存路径_没有更改的话不要改动此配置"].len() > 0) Script(Config["PVF储存路径_没有更改的话不要改动此配置"]); //else Script(); //读取装备列表 getroottable()._Nangua_EquipmentData_List_ = ScriptData.GetFileData("equipment/equipment.lst", function(DataTable, Data) { while (!Data.Eof()) { local Key = Data.Get(); //注册装备列表 路径写入 数据未读取 DataTable.rawset(Key, Data.Get()); } }); Cb_SelectDungeon_Check_Error_Leave_Func.Check_anti_evilByNangua <- function(args) { local Config = GlobalConfig.Get("抗魔值进入副本配置_Nangua.json"); local SUser = User(args[1]); local msg_base = args[2]; local PartyObj = SUser.GetParty(); local dgn_id = NativePointer(msg_base).add(13).readU16(); // 获取副本ID local dgn_diff = NativePointer(msg_base).add(15).readU8(); // 获取副本难度 local required_grade = _evilDgnBynangua.get_required_gradeBynangua(dgn_id, dgn_diff); local diff_name = Config["副本难度命名"][(dgn_diff).tostring()]; local Dungeon_Name = _evilDgnBynangua.api_CDungeon_getDungeonName(dgn_id); if (PartyObj && Config["抗魔值进入副本"]["抗魔值进入副本开关(true为开启,false为关闭)"]) { local not_enough_users = []; for (local i = 0; i < 4; ++i) { local Tuser = PartyObj.GetUser(i); if (Tuser) { local total_grade = 0; local InvenObj = Tuser.GetInven(); if (InvenObj) { for (local j = 0; j <= 25; j++) { local ItemObj = InvenObj.GetSlot(0, j); if (!ItemObj.IsEmpty) { local item_id = ItemObj.GetIndex(); print(item_id); local Anti = _Nangua_GetEquipmentData_Anti_(item_id); total_grade += Anti; } } } // 比对抗魔值是否足够 if (total_grade < required_grade) { not_enough_users.push(Tuser.GetCharacName()); } } } // 处理未达到抗魔值要求的用户 if (not_enough_users.len() > 0) { local joinedNames = _evilDgnBynangua.join(not_enough_users, ", "); SUser.SendNotiBox("队伍中玩家[" + joinedNames + "] 抗魔值低于 " + required_grade + " ,无法进入 [" + Dungeon_Name + " - " + diff_name + "]", 2) return 1; // 禁止进入副本 } } } }