DP-S-Script/OfficialProject/副本播报/副本播报.nut

194 lines
7.4 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
}
}