## 通关时间播报 (贡献者: 邪神) > 首先我们先在dp_s文件夹中建立一个项目文件夹 MyProject 方便管理 ![Alt text](../../image/6.png) > 然后我们建立一个新文件 通关时间播报.nut 用于编写我们的代码 > 然后我们在通关时间播报.nut中写入以下代码 ``` //贡献者: 邪神 ClearTimeMsg <- "玩家[%s]通关<%s>[%s]耗时:[%s]"; //难度对应难度名称 dungeon_diff_Map <- { "0": "普通级", "1": "冒险级", "2": "王者级", "3": "地狱级", "4": "英雄级" }; //通关时间回调 Cb_CParty_SetBestClearTime_Enter_Func.ClearTime <- function(args) { local PartyObj = Party(args[0]); local dungeon_diff = args[2]; local clearTime = args[3]; local Bfobj = PartyObj.GetBattleField(); local DgnObj = Bfobj.GetDgn(); local Dungeon_Name = DgnObj.GetName(); local diff_name = dungeon_diff_Map[(dungeon_diff).tostring()]; local MemberNames = []; for (local i = 0; i < 4; ++i) { local SUser = PartyObj.GetUser(i); if (SUser) { local name = SUser.GetCharacName(); MemberNames.push(name); } } local joinedNames = join(MemberNames, ", "); local time = formatMilliseconds(clearTime); World.SendNotiPacketMessage(format(ClearTimeMsg, joinedNames, diff_name, Dungeon_Name, time), 0); } 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; } ``` > 最后我们回到dp_s文件夹中,打开Main.nut 加载我们刚才编写的逻辑 ``` sq_RunScript("MyProject/通关时间播报.nut"); ``` > 至此一个简单的通关时间播报的逻辑就写完了