EnterDungeon <- {}; LeaveDungeon <- {}; ClearDungeon <- {}; dungeon_cleared <- {}; dungeon_cache <- {}; function _Dps_send_dungeon_msg_Main_() { //进入副本加载完毕时 Cb_Party_OnStartMapFinishLoading_Enter_Func.EnterStartMapByNangua <- function(args) { local Cofig = GlobalConfig.Get("副本播报配置_Nangua.json"); local PartyObj = Party(args[0]); if(!PartyObj) return if (!Cofig["副本播报开关(true开启,false关闭)"]) { return; } for (local i = 0; i < 4; ++i) { local SUser = PartyObj.GetUser(i); if (SUser) { if(SUser.GetCID() in dungeon_cache){ dungeon_cache.rawdelete(SUser.GetCID()); } dungeon_cleared[SUser.GetCID()] <- false; // 进入副本时初始化标志为未通关 local Bfobj = PartyObj.GetBattleField(); local DgnObj = Bfobj.GetDgn(); local DgnID = DgnObj.GetId(); local Dungeon_Name = DgnObj.GetName(); local dungeon_type = NativePointer(Bfobj.C_Object).add(460).readU8(); // 0 为普通副本,1 为非常困难深渊,2 为困难深渊 local dungeon_diff = Sq_CallFunc(S_Ptr("0x080F981C"), "int", ["pointer"], Bfobj.C_Object); // 获取副本难度 local diff_name = Cofig["副本难度命名"][(dungeon_diff).tostring()]; // 获取副本难度名称 local dgntypeName = _clear_dgn_Bynangua.DungeonType[(dungeon_type).tostring()]; local DgnData = { "entered": true, "Dungeon_Name": Dungeon_Name, "dgntypeName": dgntypeName, "diff_name": diff_name, "totalTime": 0 }; //以角色ID为键记录副本信息 dungeon_cache[SUser.GetCID()] <- DgnData; } } } //清理房间完毕时 Cb_Battle_Field_onClearMap_Leave_Func.onClearMapByNangua <- function(args) { local Cofig = GlobalConfig.Get("副本播报配置_Nangua.json"); local retval = args.pop(); local CBattle_Field = args[0]; local PartyObj = Party(NativePointer(CBattle_Field).add(-2852).C_Object); if(!PartyObj) return local DgnId = NativePointer(args[0]).add(404).readInt(); if (!Cofig["副本播报开关(true开启,false关闭)"]) { return; } if (retval == DgnId) { for (local i = 0; i < 4; ++i) { local SUser = PartyObj.GetUser(i); if (SUser) { if (dungeon_cache.rawin(SUser.GetCID()) && dungeon_cache[SUser.GetCID()].rawin("entered")) { local time = Sq_CallFunc(S_Ptr("0x085B6768"), "int", ["pointer"], PartyObj.C_Object); dungeon_cache[SUser.GetCID()]["totalTime"] += time; } } } } } //放弃副本或未通关副本时 Cb_Party_giveup_game_Enter_Func.giveupByNangua <- function(args) { local Cofig = GlobalConfig.Get("副本播报配置_Nangua.json"); local PartyObj = Party(args[0]); local killcount = Sq_CallFunc(S_Ptr("0x085BF456"), "int", ["pointer"], NativePointer(args[0]).add(812).C_Object); if (!PartyObj) return; if (!Cofig["副本播报开关(true开启,false关闭)"]) return; local SUser = User(args[1]); local Party_Master = PartyObj.GetMaster(); local MasterName = Party_Master.GetCharacName(); local formattedTime = ""; local DgnId = NativePointer(args[0]).add(814 * 4).readInt(); local name = SUser.GetCharacName(); // 如果副本ID不在允许播报的数组内则跳出 if (Cofig["不需要播报的副本ID"].find(DgnId) != null) { return; } if (SUser.GetCID() in dungeon_cache) { local dungeonInfo = dungeon_cache[SUser.GetCID()]; local dgnTypeName = dungeonInfo["dgntypeName"]; local dungeonName = dungeonInfo["Dungeon_Name"]; local diffName = dungeonInfo["diff_name"]; local totalTime = 0; if (dungeon_cache.rawin(SUser.GetCID()) && dungeon_cache[SUser.GetCID()].rawin("totalTime")) { totalTime = dungeon_cache[SUser.GetCID()]["totalTime"]; formattedTime = _clear_dgn_Bynangua.formatMilliseconds(totalTime); } if (dungeon_cleared.rawin(SUser.GetCID()) && dungeon_cleared[SUser.GetCID()] == true) { dungeon_cache.rawdelete(SUser.GetCID()); dungeon_cleared[SUser.GetCID()] <- false; } else { // 发送未通关信息 if (totalTime == 0) { World.SendNotiPacketMessage(format(Cofig["未通过一个小地图播报信息"], name, dgnTypeName, dungeonName, diffName, killcount), Cofig["发送信息位置"]); } else if (MasterName == SUser.GetCharacName()) { World.SendNotiPacketMessage(format(Cofig["放弃副本"], name, dgnTypeName, dungeonName, diffName, formattedTime, killcount), Cofig["发送信息位置"]); } else { World.SendNotiPacketMessage(format(Cofig["在队伍中提前退出副本"], name, MasterName, dgnTypeName, dungeonName, diffName, formattedTime, killcount), Cofig["发送信息位置"]) } dungeon_cache.rawdelete(SUser.GetCID()); } } } //通关副本时 Cb_CParty_SetBestClearTime_Enter_Func.ClearTimeByNangua <- function (args) { local Cofig = GlobalConfig.Get("副本播报配置_Nangua.json"); local PartyObj = Party(args[0]); local killcount = Sq_CallFunc(S_Ptr("0x085BF456"), "int", ["pointer"], NativePointer(args[0]).add(812).C_Object); if(!PartyObj) return local dungeon_diff = args[2]; local clearTime = args[3]; local Bfobj = PartyObj.GetBattleField(); local DgnObj = Bfobj.GetDgn(); local diff_name = Cofig["副本难度命名"][(dungeon_diff).tostring()]; if (!Cofig["副本播报开关(true开启,false关闭)"]) { return; } if (DgnObj) { local Dungeon_Name = DgnObj.GetName(); local MemberNames = []; for (local i = 0; i < 4; ++i) { local SUser = PartyObj.GetUser(i); if (SUser) { local name = SUser.GetCharacName(); MemberNames.append(name); dungeon_cleared[SUser.GetCID()] <- true; } } local joinedNames = _clear_dgn_Bynangua.join(MemberNames, ", "); local time = _clear_dgn_Bynangua.formatMilliseconds(clearTime); World.SendNotiPacketMessage(format(Cofig["通关播报信息"], joinedNames, Dungeon_Name, diff_name, time, killcount), Cofig["发送信息位置"]); for (local i = 0; i < 4; ++i) { local TUser = PartyObj.GetUser(i); if (TUser) { local CID = TUser.GetCID(); if (CID) { dungeon_cache.rawdelete(CID); } } } } } } class _clear_dgn_Bynangua { DungeonType = { "0": "", "1": "非常困难级深渊-", "2": "困难级深渊-", }; function join(array, delimiter) { local result = ""; for (local i = 0; i < array.len(); ++i) { if (i > 0) { result += delimiter; } result += array[i]; } return result; } function formatMilliseconds(ms) { local str = ""; local minutes = ms / 60000; local seconds = (ms % 60000) / 1000; local milliseconds = (ms % 1000) / 10; if (minutes > 0) { str = minutes + "分" + (seconds < 10 ? "0" : "") + seconds + "秒" + (milliseconds < 10 ? "0" : "") + milliseconds; } else { str = seconds + "秒" + (milliseconds < 10 ? "0" : "") + milliseconds; } return str; } }