194 lines
7.4 KiB
Plaintext
194 lines
7.4 KiB
Plaintext
|
|
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;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|