Files
DP-S_Script/示例项目/深渊活动/深渊活动.nut
2026-04-16 16:27:53 +08:00

954 lines
40 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.
// 深渊活动状态枚举
local HELLPARTY_STATE_END = 0; // 活动结束状态
local HELLPARTY_STATE_RUNNING = 1; // 活动进行中状态
// 深渊活动数据
local hellpartyEventInfo = {
"state": HELLPARTY_STATE_END, // 当前活动状态
"start_time": 0, // 活动开始时间
"reward_counts": {}, // 每个指定道具的剩余奖励次数
"last_reminder_minute": -1, // 上次提醒的分钟数,初始化为-1
"last_reminder_second": -1, // 上次提醒的秒数,初始化为-1
"current_time_slot": null, // 当前活动时间段配置
"drop_prevention_enabled": false // 是否启用了禁止丢弃物品
}
// 初始化禁止丢弃物品功能
function Init_Hellparty_Drop_Prevention() {
// 如果没有创建过这个模拟内存就创建
if(!getroottable().rawin("_HellpartyEmptyCharacInfo_")) {
getroottable()._HellpartyEmptyCharacInfo_ <- Memory.alloc(17);
Memory.reset(getroottable()._HellpartyEmptyCharacInfo_, 17);
}
// 如果没有创建过这个跳转Flag就创建并初始化
if(!getroottable().rawin("_HellpartyDropPreventFlag_")) {
getroottable()._HellpartyDropPreventFlag_ <- false;
}
}
// 深渊活动入口点
function _Dps_Start_Hellparty_Event_Main_() {
_Dps_Start_Hellparty_Event_Logic_();
}
// 深渊活动重载入口点
function _Dps_Start_Hellparty_Event_Main_Reload_(OldConfig) {
// 移除检查任务
Timer.RemoveCronTask("HellpartyCheckTask");
// 移除旧的定时任务
if (OldConfig && "深渊活动配置" in OldConfig && "活动时间段" in OldConfig["深渊活动配置"]) {
foreach(timeSlot in OldConfig["深渊活动配置"]["活动时间段"]) {
local start_time = timeSlot["开启时间"];
local task_id = format("HellpartyEventTask_%d_%d", start_time[0], start_time[1]);
Timer.RemoveCronTask(task_id);
}
}
// 设置活动状态为结束(如果当前正在进行)
if (hellpartyEventInfo.state == HELLPARTY_STATE_RUNNING) {
hellpartyEventInfo.state = HELLPARTY_STATE_END;
World.SendNotiPacketMessage("【深渊探险活动】因配置更新已结束", 14);
}
// 广播活动时间更改通知
broadcast_hellparty_time_changes();
// 重新注册
_Dps_Start_Hellparty_Event_Logic_();
}
// 深渊活动逻辑入口点
function _Dps_Start_Hellparty_Event_Logic_() {
local Config = GlobalConfig.Get("深渊活动配置_nangua.json");
// 检查活动总开关
if (!Config["深渊活动配置"]["活动总开关(true开启/false关闭)"]) {
return;
}
// 注册禁止丢弃物品的回调函数
Cb_DropItem_check_error_Enter_Func.HellpartyDropPrevention <- function(args) {
local Config = GlobalConfig.Get("深渊活动配置_nangua.json");
// 只在活动进行中、启用了禁止丢弃功能且功能开关打开时才生效
if (hellpartyEventInfo.state == HELLPARTY_STATE_RUNNING &&
hellpartyEventInfo.drop_prevention_enabled &&
Config["深渊活动配置"]["活动期间开启物品禁止丢弃功能(true开启/false关闭)"]) {
// 确保必要的变量存在
if(!getroottable().rawin("_HellpartyEmptyCharacInfo_")) {
getroottable()._HellpartyEmptyCharacInfo_ <- Memory.alloc(17);
Memory.reset(getroottable()._HellpartyEmptyCharacInfo_, 17);
}
if(!getroottable().rawin("_HellpartyDropPreventFlag_")) {
getroottable()._HellpartyDropPreventFlag_ <- false;
}
getroottable()._HellpartyDropPreventFlag_ = true;
args[1] = getroottable()._HellpartyEmptyCharacInfo_.C_Object;
}
return args;
}
Cb_DropItem_check_error_Leave_Func.HellpartyDropPrevention <- function(args) {
local Config = GlobalConfig.Get("深渊活动配置_nangua.json");
// 只在活动进行中、启用了禁止丢弃功能且功能开关打开时才生效
if (hellpartyEventInfo.state == HELLPARTY_STATE_RUNNING &&
hellpartyEventInfo.drop_prevention_enabled &&
Config["深渊活动配置"]["活动期间开启物品禁止丢弃功能(true开启/false关闭)"]) {
if(!getroottable().rawin("_HellpartyDropPreventFlag_")) {
getroottable()._HellpartyDropPreventFlag_ <- false;
return;
}
if(getroottable()._HellpartyDropPreventFlag_) {
getroottable()._HellpartyDropPreventFlag_ = false;
return 19;
}
}
}
local open_days = Config["深渊活动配置"]["每周几开放活动"];
local current_date = date();
local current_weekday = current_date.wday;
if (current_weekday == 0) current_weekday = 7; // 转换为1-7格式
// 检查今天是否开放
local is_open_today = false;
foreach(day in open_days) {
if (day == current_weekday) {
is_open_today = true;
break;
}
}
if (!is_open_today) {
return;
}
// 为每个时间段注册定时任务
foreach(timeSlot in Config["深渊活动配置"]["活动时间段"]) {
local start_time = timeSlot["开启时间"];
local start_hour = start_time[0];
local start_minute = start_time[1];
// 使用格式化的唯一任务ID
local task_id = format("HellpartyEventTask_%d_%d", start_hour, start_minute);
// 创建配置的本地副本
local timeSlotCopy = {
"开启时间": [start_time[0], start_time[1]],
"持续时间(分钟)": timeSlot["持续时间(分钟)"],
"指定道具奖励配置": {
"指定道具ID": []
}
};
// 复制指定道具奖励配置
foreach(item in timeSlot["指定道具奖励配置"]["指定道具ID"]) {
local itemCopy = {
"指定道具": item["指定道具"],
"奖励次数": item["奖励次数"],
"奖励列表": []
};
foreach(reward in item["奖励列表"]) {
itemCopy["奖励列表"].append([reward[0], reward[1]]);
}
timeSlotCopy["指定道具奖励配置"]["指定道具ID"].append(itemCopy);
}
// cron 表达式 (秒 分 时 日 月 周)
local cronExpression = format("0 %d %d * * *", start_minute, start_hour);
// 注册定时任务,传入时间段配置的副本
Timer.SetCronTask(function() {
On_Start_Hellparty_Event(timeSlotCopy);
}, {
Cron = cronExpression,
Name = task_id
});
}
// 注册回调函数
Cb_UserHistoryLog_ItemAdd_Enter_Func.Hellparty_EventByNangua <- function(args) {
// 检查活动是否在进行中
if (hellpartyEventInfo.state == HELLPARTY_STATE_END) return;
// 检查活动是否已超时
if (is_hellparty_event_timeout()) return;
local Config = GlobalConfig.Get("深渊活动配置_nangua.json");
local SUser = User(NativePointer(args[0]).readPointer());
// 使用当前活动时间段配置
if (!hellpartyEventInfo.current_time_slot) return;
local specifiedItems = hellpartyEventInfo.current_time_slot["指定道具奖励配置"]["指定道具ID"];
local InvenObj = SUser.GetInven();
local ItemObj = Item(args[4]);
// 拾取原因 4代表在副本拾取
local type = args[5];
local PartyObj = SUser.GetParty();
if (!PartyObj) return;
local Bfobj = PartyObj.GetBattleField();
local DgnObj = Bfobj.GetDgn();
if (!DgnObj) return;
local Dungeon_Name = DgnObj.GetName();
if (!ItemObj) return;
local item_id = ItemObj.GetIndex();
// 检查是否在副本中拾取了物品
if (type == 4) {
// 检查是否是指定道具
foreach(itemConfig in specifiedItems) {
if (itemConfig["指定道具"] == item_id) {
// 检查该道具的奖励次数是否已用完
local item_id_str = item_id.tostring();
if (!(item_id_str in hellpartyEventInfo.reward_counts) || hellpartyEventInfo.reward_counts[item_id_str] <= 0) {
// 奖励次数已用完
local MsgObj = AdMsg();
MsgObj.PutType(Config["深渊活动配置"]["信息发送位置"]);
if(Config["深渊活动配置"]["信息发送位置"] != 14) {
MsgObj.PutString(" ");
}
MsgObj.PutColorString("很遗憾", [255, 130, 0]);
MsgObj.PutEquipment(item_id);
MsgObj.PutColorString("的奖励次数已达上限", [255, 130, 0]);
MsgObj.Finalize();
SUser.Send(MsgObj.MakePack());
MsgObj.Delete();
return;
}
// 减少奖励次数
hellpartyEventInfo.reward_counts[item_id_str]--;
local remaining_count = hellpartyEventInfo.reward_counts[item_id_str];
// 发送奖励通知
local MsgObj = AdMsg();
MsgObj.PutType(Config["深渊活动配置"]["信息发送位置"]);
if(Config["深渊活动配置"]["信息发送位置"] != 14) {
MsgObj.PutString(" ");
}
MsgObj.PutColorString("◆━━━━━━ 深渊探险活动 ━━━━━━◆", [255, 255, 0]);
MsgObj.Finalize();
World.SendAll(MsgObj.MakePack());
MsgObj.Delete();
local MsgObj2 = AdMsg();
MsgObj2.PutType(Config["深渊活动配置"]["信息发送位置"]);
if(Config["深渊活动配置"]["信息发送位置"] != 14) {
MsgObj2.PutString(" ");
}
MsgObj2.PutColorString("恭喜 ", [255, 255, 0]);
MsgObj2.PutColorString("[" + SUser.GetCharacName() + "]", [255, 20, 0]);
MsgObj2.PutColorString(" 获得指定物品:", [255, 255, 0]);
MsgObj2.Finalize();
World.SendAll(MsgObj2.MakePack());
MsgObj2.Delete();
local MsgObj3 = AdMsg();
MsgObj3.PutType(Config["深渊活动配置"]["信息发送位置"]);
if(Config["深渊活动配置"]["信息发送位置"] != 14) {
MsgObj3.PutString(" ");
}
MsgObj3.PutColorString("★ ", [255, 20, 0]);
MsgObj3.PutEquipment(item_id);
MsgObj3.Finalize();
World.SendAll(MsgObj3.MakePack());
MsgObj3.Delete();
// 发送奖励列表头部
local rewardHeader = AdMsg();
rewardHeader.PutType(Config["深渊活动配置"]["信息发送位置"]);
if(Config["深渊活动配置"]["信息发送位置"] != 14) {
rewardHeader.PutString(" ");
}
rewardHeader.PutColorString("├ 获得奖励:", [255, 255, 0]);
rewardHeader.Finalize();
World.SendAll(rewardHeader.MakePack());
rewardHeader.Delete();
// 收集所有奖励
local allRewards = [];
foreach(reward in itemConfig["奖励列表"]) {
local rewardId = reward[0];
local rewardCount = reward[1];
// 收集非点券和代币的道具奖励
if (rewardId != 0 && rewardId != 1) {
allRewards.append([rewardId, rewardCount]);
}
// 发放点券和代币奖励
if (rewardId == 0) {
SUser.RechargeCera(rewardCount);
} else if (rewardId == 1) {
SUser.RechargeCeraPoint(rewardCount);
}
// 显示奖励信息
local rewardMsg = AdMsg();
rewardMsg.PutType(Config["深渊活动配置"]["信息发送位置"]);
if(Config["深渊活动配置"]["信息发送位置"] != 14) {
rewardMsg.PutString(" ");
}
rewardMsg.PutColorString("│", [255, 255, 0]);
rewardMsg.PutColorString(" ★ ", [0, 191, 255]);
if (rewardId == 0) {
rewardMsg.PutColorString("[点券]", [0, 191, 255]);
} else if (rewardId == 1) {
rewardMsg.PutColorString("[代币]", [0, 191, 255]);
} else {
rewardMsg.PutEquipment(rewardId);
}
rewardMsg.PutColorString(" x ", [255, 255, 255]);
rewardMsg.PutColorString("<" + rewardCount + ">", [255, 20, 0]);
rewardMsg.Finalize();
World.SendAll(rewardMsg.MakePack());
rewardMsg.Delete();
}
// 一次性发放所有道具奖励
if (allRewards.len() > 0) {
Nangua_Hellparty.api_CUser_Add_Item_list(SUser, allRewards);
}
// 显示剩余次数
local remainMsg = AdMsg();
remainMsg.PutType(Config["深渊活动配置"]["信息发送位置"]);
if(Config["深渊活动配置"]["信息发送位置"] != 14) {
remainMsg.PutString(" ");
}
remainMsg.PutColorString("└ 剩余次数:", [255, 255, 0]);
remainMsg.PutColorString("<" + remaining_count + ">", [255, 20, 0]);
remainMsg.PutColorString("次", [255, 255, 0]);
remainMsg.Finalize();
World.SendAll(remainMsg.MakePack());
remainMsg.Delete();
// 发送底部分隔线
local footerMsg = AdMsg();
footerMsg.PutType(Config["深渊活动配置"]["信息发送位置"]);
if(Config["深渊活动配置"]["信息发送位置"] != 14) {
footerMsg.PutString(" ");
}
footerMsg.PutColorString("◆━━━━━━━━━━━━━━━━━━━◆", [255, 255, 0]);
footerMsg.Finalize();
World.SendAll(footerMsg.MakePack());
footerMsg.Delete();
break;
}
}
}
}
// 玩家登录时播报此次深渊活动进度及指定道具信息
Cb_reach_game_world_Func.hellpartyByNangua <- function(SUser) {
local Config = GlobalConfig.Get("深渊活动配置_nangua.json");
//深渊活动更新进度
if (hellpartyEventInfo.state != HELLPARTY_STATE_END) {
//通知客户端当前活动状态
local remain_time = event_hellparty_get_remain_time();
local minutes_left = (remain_time / 60).tointeger();
local seconds_left = remain_time % 60;
// 发送活动剩余时间信息
local timeMsg = AdMsg();
timeMsg.PutType(Config["深渊活动配置"]["信息发送位置"]);
if(Config["深渊活动配置"]["信息发送位置"] != 14) {
timeMsg.PutString(" ");
}
timeMsg.PutColorString("◆━━━━ 深渊探险活动进行中 ━━━━◆", [255, 255, 0]);
timeMsg.Finalize();
SUser.Send(timeMsg.MakePack());
timeMsg.Delete();
local timeMsg2 = AdMsg();
timeMsg2.PutType(Config["深渊活动配置"]["信息发送位置"]);
if(Config["深渊活动配置"]["信息发送位置"] != 14) {
timeMsg2.PutString(" ");
}
timeMsg2.PutColorString(" 剩余时间: ", [255, 255, 255]);
if (minutes_left > 0) {
timeMsg2.PutColorString("<" + minutes_left + ">", [255, 20, 0]);
timeMsg2.PutColorString("分", [255, 255, 255]);
}
if (seconds_left > 0 || minutes_left == 0) {
timeMsg2.PutColorString("<" + seconds_left + ">", [255, 20, 0]);
timeMsg2.PutColorString("秒", [255, 255, 255]);
}
timeMsg2.Finalize();
SUser.Send(timeMsg2.MakePack());
timeMsg2.Delete();
// 如果启用了禁止丢弃功能,发送提示
if (Config["深渊活动配置"]["活动期间开启物品禁止丢弃功能(true开启/false关闭)"]) {
local dropMsg1 = AdMsg();
dropMsg1.PutType(Config["深渊活动配置"]["信息发送位置"]);
if(Config["深渊活动配置"]["信息发送位置"] != 14) {
dropMsg1.PutString(" ");
}
dropMsg1.PutColorString(" 特别提示:活动期间", [255, 255, 0]);
dropMsg1.PutColorString("无法丢弃物品", [255, 20, 0]);
dropMsg1.Finalize();
SUser.Send(dropMsg1.MakePack());
dropMsg1.Delete();
}
// 向玩家单独发送指定道具信息
if (!hellpartyEventInfo.current_time_slot) return;
local specifiedItems = hellpartyEventInfo.current_time_slot["指定道具奖励配置"]["指定道具ID"];
// 发送活动道具信息头部
local headerMsg = AdMsg();
headerMsg.PutType(Config["深渊活动配置"]["信息发送位置"]);
if(Config["深渊活动配置"]["信息发送位置"] != 14) {
headerMsg.PutString(" ");
}
headerMsg.PutColorString("◆━━━━━ 本次活动指定道具 ━━━━━◆", [255, 255, 0]);
headerMsg.Finalize();
SUser.Send(headerMsg.MakePack());
headerMsg.Delete();
// 发送每个指定道具的信息
foreach(itemConfig in specifiedItems) {
local itemId = itemConfig["指定道具"];
local itemIdStr = itemId.tostring();
local remainingCount = itemIdStr in hellpartyEventInfo.reward_counts ? hellpartyEventInfo.reward_counts[itemIdStr] : 0;
// 显示道具名称
local itemMsgLine1 = AdMsg();
itemMsgLine1.PutType(Config["深渊活动配置"]["信息发送位置"]);
if(Config["深渊活动配置"]["信息发送位置"] != 14) {
itemMsgLine1.PutString(" ");
}
itemMsgLine1.PutColorString("★ ", [255, 20, 0]);
itemMsgLine1.PutEquipment(itemId);
itemMsgLine1.Finalize();
SUser.Send(itemMsgLine1.MakePack());
itemMsgLine1.Delete();
// 显示可获奖励提示
local rewardHeader = AdMsg();
rewardHeader.PutType(Config["深渊活动配置"]["信息发送位置"]);
rewardHeader.PutColorString("├ 可获奖励:", [255, 255, 0]);
rewardHeader.Finalize();
SUser.Send(rewardHeader.MakePack());
rewardHeader.Delete();
// 显示每个奖励
foreach(reward in itemConfig["奖励列表"]) {
local rewardId = reward[0];
local rewardCount = reward[1];
local itemMsgLine2 = AdMsg();
itemMsgLine2.PutType(Config["深渊活动配置"]["信息发送位置"]);
if(Config["深渊活动配置"]["信息发送位置"] != 14) {
itemMsgLine2.PutString(" ");
}
itemMsgLine2.PutColorString("│", [255, 255, 0]);
itemMsgLine2.PutColorString(" ★ ", [0, 191, 255]);
if (rewardId == 0) {
itemMsgLine2.PutColorString("[点券]", [0, 191, 255]);
} else if (rewardId == 1) {
itemMsgLine2.PutColorString("[代币]", [0, 191, 255]);
} else {
itemMsgLine2.PutEquipment(rewardId);
}
itemMsgLine2.PutColorString(" x ", [255, 255, 255]);
itemMsgLine2.PutColorString("<" + rewardCount + ">", [255, 20, 0]);
itemMsgLine2.Finalize();
SUser.Send(itemMsgLine2.MakePack());
itemMsgLine2.Delete();
}
// 显示剩余次数
local remainMsg = AdMsg();
remainMsg.PutType(Config["深渊活动配置"]["信息发送位置"]);
if(Config["深渊活动配置"]["信息发送位置"] != 14) {
remainMsg.PutString(" ");
}
remainMsg.PutColorString("└ 剩余次数:", [255, 255, 0]);
remainMsg.PutColorString("<" + remainingCount + ">", [255, 20, 0]);
remainMsg.PutColorString("次", [255, 255, 0]);
remainMsg.Finalize();
SUser.Send(remainMsg.MakePack());
remainMsg.Delete();
}
// 发送底部分隔线
local footerMsg = AdMsg();
footerMsg.PutType(Config["深渊活动配置"]["信息发送位置"]);
if(Config["深渊活动配置"]["信息发送位置"] != 14) {
footerMsg.PutString(" ");
}
footerMsg.PutColorString("◆━━━━━━━━━━━━━━━━━━━◆", [255, 255, 0]);
footerMsg.Finalize();
SUser.Send(footerMsg.MakePack());
footerMsg.Delete();
}
}
}
// 开始深渊活动
function On_Start_Hellparty_Event(timeSlot) {
// 先确保移除任何已存在的检查任务,避免重复
Timer.RemoveCronTask("HellpartyCheckTask");
// 初始化活动状态
Reset_Hellparty_Info();
hellpartyEventInfo.current_time_slot = timeSlot;
local Config = GlobalConfig.Get("深渊活动配置_nangua.json");
// 启用禁止丢弃物品(根据配置决定)
if (Config["深渊活动配置"]["活动期间开启物品禁止丢弃功能(true开启/false关闭)"]) {
if (!hellpartyEventInfo.drop_prevention_enabled) {
Init_Hellparty_Drop_Prevention();
hellpartyEventInfo.drop_prevention_enabled = true;
}
}
// 注册定时检查任务(每5秒检查一次)
Timer.SetCronTask(Event_Hellparty_Timer, {
Cron = "*/5 * * * * *", // 每5秒执行一次
Name = "HellpartyCheckTask"
});
// 发送活动开始公告
local start_time = timeSlot["开启时间"];
local event_start = AdMsg();
event_start.PutType(Config["深渊活动配置"]["信息发送位置"]);
if(Config["深渊活动配置"]["信息发送位置"] != 14) {
event_start.PutString(" ");
}
event_start.PutColorString("◆━━━━━ 深渊探险活动开启 ━━━━━◆", [255, 255, 0]);
event_start.Finalize();
World.SendAll(event_start.MakePack());
event_start.Delete();
local event_start2 = AdMsg();
event_start2.PutType(Config["深渊活动配置"]["信息发送位置"]);
if(Config["深渊活动配置"]["信息发送位置"] != 14) {
event_start2.PutString(" ");
}
event_start2.PutColorString(" 活动持续时间:", [255, 255, 0]);
event_start2.PutColorString("<" + timeSlot["持续时间(分钟)"] + ">", [255, 20, 0]);
event_start2.PutColorString("分钟", [255, 255, 0]);
event_start2.PutColorString(" 祝各位勇士好运!", [255, 255, 0]);
event_start2.Finalize();
World.SendAll(event_start2.MakePack());
event_start2.Delete();
// 如果启用了禁止丢弃功能,发送提示
if (Config["深渊活动配置"]["活动期间开启物品禁止丢弃功能(true开启/false关闭)"]) {
local dropMsg2 = AdMsg();
dropMsg2.PutType(Config["深渊活动配置"]["信息发送位置"]);
if(Config["深渊活动配置"]["信息发送位置"] != 14) {
dropMsg2.PutString(" ");
}
dropMsg2.PutColorString(" 特别提示:活动期间", [255, 255, 0]);
dropMsg2.PutColorString("无法丢弃物品", [255, 20, 0]);
dropMsg2.Finalize();
World.SendAll(dropMsg2.MakePack());
dropMsg2.Delete();
}
// 播报本次指定道具信息
SendSpecifiedItemsInfo();
}
// 播报本次深渊活动指定道具信息
function SendSpecifiedItemsInfo() {
if (!hellpartyEventInfo.current_time_slot) return;
local specifiedItems = hellpartyEventInfo.current_time_slot["指定道具奖励配置"]["指定道具ID"];
local Config = GlobalConfig.Get("深渊活动配置_nangua.json");
// 发送活动道具信息头部
local headerMsg = AdMsg();
headerMsg.PutType(Config["深渊活动配置"]["信息发送位置"]);
if(Config["深渊活动配置"]["信息发送位置"] != 14) {
headerMsg.PutString(" ");
}
headerMsg.PutColorString("◆━━━━━ 本次活动指定道具 ━━━━━◆", [255, 255, 0]);
headerMsg.Finalize();
World.SendAll(headerMsg.MakePack());
headerMsg.Delete();
// 发送每个指定道具的信息
foreach(itemConfig in specifiedItems) {
local itemId = itemConfig["指定道具"];
local rewardTimes = itemConfig["奖励次数"];
// 初始化该道具的奖励次数
hellpartyEventInfo.reward_counts[itemId.tostring()] <- rewardTimes;
// 显示道具名称
local itemMsgLine1 = AdMsg();
itemMsgLine1.PutType(Config["深渊活动配置"]["信息发送位置"]);
if(Config["深渊活动配置"]["信息发送位置"] != 14) {
itemMsgLine1.PutString(" ");
}
itemMsgLine1.PutColorString("★ ", [255, 20, 0]);
itemMsgLine1.PutEquipment(itemId);
itemMsgLine1.Finalize();
World.SendAll(itemMsgLine1.MakePack());
itemMsgLine1.Delete();
// 显示可获奖励提示
local rewardHeader = AdMsg();
rewardHeader.PutType(Config["深渊活动配置"]["信息发送位置"]);
if(Config["深渊活动配置"]["信息发送位置"] != 14) {
rewardHeader.PutString(" ");
}
rewardHeader.PutColorString("├ 可获奖励:", [255, 255, 0]);
rewardHeader.Finalize();
World.SendAll(rewardHeader.MakePack());
rewardHeader.Delete();
// 显示每个奖励
foreach(reward in itemConfig["奖励列表"]) {
local rewardId = reward[0];
local rewardCount = reward[1];
local itemMsgLine2 = AdMsg();
itemMsgLine2.PutType(Config["深渊活动配置"]["信息发送位置"]);
if(Config["深渊活动配置"]["信息发送位置"] != 14) {
itemMsgLine2.PutString(" ");
}
itemMsgLine2.PutColorString("│", [255, 255, 0]);
itemMsgLine2.PutColorString(" ★ ", [0, 191, 255]);
if (rewardId == 0) {
// 点券奖励
itemMsgLine2.PutColorString("[点券]", [0, 191, 255]);
} else if (rewardId == 1) {
// 代币奖励
itemMsgLine2.PutColorString("[代币]", [0, 191, 255]);
} else {
// 普通道具奖励
itemMsgLine2.PutEquipment(rewardId);
}
itemMsgLine2.PutColorString(" x ", [255, 255, 255]);
itemMsgLine2.PutColorString("<" + rewardCount + ">", [255, 20, 0]);
itemMsgLine2.Finalize();
World.SendAll(itemMsgLine2.MakePack());
itemMsgLine2.Delete();
}
// 显示剩余次数
local remainMsg = AdMsg();
remainMsg.PutType(Config["深渊活动配置"]["信息发送位置"]);
if(Config["深渊活动配置"]["信息发送位置"] != 14) {
remainMsg.PutString(" ");
}
remainMsg.PutColorString("└ 剩余次数:", [255, 255, 0]);
remainMsg.PutColorString("<" + rewardTimes + ">", [255, 20, 0]);
remainMsg.PutColorString("次", [255, 255, 0]);
remainMsg.Finalize();
World.SendAll(remainMsg.MakePack());
remainMsg.Delete();
}
// 发送底部分隔线
local footerMsg = AdMsg();
footerMsg.PutType(Config["深渊活动配置"]["信息发送位置"]);
if(Config["深渊活动配置"]["信息发送位置"] != 14) {
footerMsg.PutString(" ");
}
footerMsg.PutColorString("◆━━━━━━━━━━━━━━━━━━━◆", [255, 255, 0]);
footerMsg.Finalize();
World.SendAll(footerMsg.MakePack());
footerMsg.Delete();
}
// 重置深渊活动信息
function Reset_Hellparty_Info() {
hellpartyEventInfo.state = HELLPARTY_STATE_RUNNING;
hellpartyEventInfo.start_time = time();
hellpartyEventInfo.reward_counts = {}; // 清空奖励次数记录
hellpartyEventInfo.last_reminder_minute = -1; // 重置上次提醒的分钟数
hellpartyEventInfo.last_reminder_second = -1; // 重置上次提醒的秒数
print(">>>>>>>>>>>>>>深渊活动数据已初始化<<<<<<<<<<<<<<");
}
// 深渊活动定时器检查
function Event_Hellparty_Timer() {
if (hellpartyEventInfo.state == HELLPARTY_STATE_END)
return;
// 检查活动是否结束
if (is_hellparty_event_timeout()) {
// 活动结束
on_end_event_hellparty();
return;
}
// 发送活动剩余时间提醒
local remain_time = event_hellparty_get_remain_time();
local minutes_left = (remain_time / 60).tointeger();
local seconds_left = remain_time % 60;
// 使用秒数范围来判断提醒时机,确保更精确
if (remain_time <= 65 && remain_time > 60 && hellpartyEventInfo.last_reminder_minute != 1) {
// 即将进入最后一分钟
World.SendNotiPacketMessage("【深渊探险活动】还剩最后<1>分钟结束!", 14);
hellpartyEventInfo.last_reminder_minute = 1;
} else if (remain_time <= 305 && remain_time > 300 && hellpartyEventInfo.last_reminder_minute != 5) {
// 即将进入最后五分钟
World.SendNotiPacketMessage("【深渊探险活动】还剩<5>分钟结束!", 14);
hellpartyEventInfo.last_reminder_minute = 5;
} else if (remain_time <= 245 && remain_time > 240 && hellpartyEventInfo.last_reminder_minute != 4) {
// 即将进入最后四分钟
World.SendNotiPacketMessage("【深渊探险活动】还剩<4>分钟结束!", 14);
hellpartyEventInfo.last_reminder_minute = 4;
} else if (remain_time <= 185 && remain_time > 180 && hellpartyEventInfo.last_reminder_minute != 3) {
// 即将进入最后三分钟
World.SendNotiPacketMessage("【深渊探险活动】还剩<3>分钟结束!", 14);
hellpartyEventInfo.last_reminder_minute = 3;
} else if (remain_time <= 125 && remain_time > 120 && hellpartyEventInfo.last_reminder_minute != 2) {
// 即将进入最后两分钟
World.SendNotiPacketMessage("【深渊探险活动】还剩<2>分钟结束!", 14);
hellpartyEventInfo.last_reminder_minute = 2;
}
// 最后30秒倒计时每10秒提醒一次
if (minutes_left == 0 && seconds_left <= 30 && seconds_left > 0) {
if (seconds_left % 10 == 0 && hellpartyEventInfo.last_reminder_second != seconds_left) {
World.SendNotiPacketMessage("【深渊探险活动】还剩<" + seconds_left + ">秒结束!", 14);
hellpartyEventInfo.last_reminder_second = seconds_left;
}
}
}
// 检查活动是否已超时
function is_hellparty_event_timeout() {
if (!hellpartyEventInfo.current_time_slot) return true;
return event_hellparty_get_remain_time() <= 0;
}
// 计算活动剩余时间(秒)
function event_hellparty_get_remain_time() {
if (!hellpartyEventInfo.current_time_slot) return 0;
local cur_time = time();
local duration_seconds = hellpartyEventInfo.current_time_slot["持续时间(分钟)"] * 60;
local event_end_time = hellpartyEventInfo.start_time + duration_seconds;
local remain_time = event_end_time - cur_time;
return remain_time;
}
// 结束深渊活动
function on_end_event_hellparty() {
if (hellpartyEventInfo.state == HELLPARTY_STATE_END)
return;
// 设置活动状态为结束
hellpartyEventInfo.state = HELLPARTY_STATE_END;
// 关闭禁止丢弃物品
if (hellpartyEventInfo.drop_prevention_enabled) {
// 重置丢弃物品的Hook标志
if (getroottable().rawin("_HellpartyDropPreventFlag_")) {
getroottable()._HellpartyDropPreventFlag_ = false;
}
hellpartyEventInfo.drop_prevention_enabled = false;
}
// 移除定时检查任务
Timer.RemoveCronTask("HellpartyCheckTask");
// 发送活动结束公告
World.SendNotiPacketMessage("【深渊探险活动】已结束, 感谢各位勇士的参与!", 14);
// 获取下一个活动时间
local Config = GlobalConfig.Get("深渊活动配置_nangua.json");
local current_time = date();
local current_hour = current_time.hour;
local current_minute = current_time.min;
// 获取当前是周几
local current_date = date();
local current_weekday = current_date.wday;
if (current_weekday == 0) current_weekday = 7; // 转换为1-7格式
// 获取开放日期配置
local open_days = Config["深渊活动配置"]["每周几开放活动"];
local time_slots = Config["深渊活动配置"]["活动时间段"];
// 将时间段按时间排序
local sorted_time_slots = [];
foreach(slot in time_slots) {
sorted_time_slots.append(slot);
}
// 按时间排序(冒泡排序)
for(local i = 0; i < sorted_time_slots.len() - 1; i++) {
for(local j = 0; j < sorted_time_slots.len() - 1 - i; j++) {
local time1 = sorted_time_slots[j]["开启时间"];
local time2 = sorted_time_slots[j + 1]["开启时间"];
if(time1[0] > time2[0] || (time1[0] == time2[0] && time1[1] > time2[1])) {
local temp = sorted_time_slots[j];
sorted_time_slots[j] = sorted_time_slots[j + 1];
sorted_time_slots[j + 1] = temp;
}
}
}
// 查找下一个活动时间
local next_time_slot = null;
local next_day = null;
// 先尝试找今天剩余的时间段
foreach(timeSlot in sorted_time_slots) {
local start_time = timeSlot["开启时间"];
local start_hour = start_time[0];
local start_minute = start_time[1];
// 如果找到未来的时间点,就使用它
if ((start_hour > current_hour) || (start_hour == current_hour && start_minute > current_minute)) {
next_time_slot = timeSlot;
next_day = current_weekday;
break;
}
}
// 如果没找到今天剩余的时间段,查找下一个开放日
if (!next_time_slot) {
// 查找下一个开放日
for (local i = 1; i <= 7; i++) {
local check_day = (current_weekday + i) % 7;
if (check_day == 0) check_day = 7;
foreach(open_day in open_days) {
if (open_day == check_day) {
next_day = check_day;
next_time_slot = sorted_time_slots[0]; // 使用排序后的第一个时间段
break;
}
}
if (next_time_slot) break;
}
}
// 如果找到下一个活动时间,发送通知
if (next_time_slot) {
local start_time = next_time_slot["开启时间"];
local day_names = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"];
local day_text = "";
if (next_day == current_weekday) {
day_text = "今天";
} else if (next_day > current_weekday) {
day_text = "本周" + day_names[next_day - 1];
} else {
day_text = "下" + day_names[next_day - 1];
}
World.SendNotiPacketMessage(format("【深渊探险活动】下次活动时间为%s [%d:%02d],敬请期待!", day_text, start_time[0], start_time[1]), 14);
}
print(">>>>>>>>>>>>>>深渊活动已结束<<<<<<<<<<<<<<");
}
// 广播活动时间更改通知
function broadcast_hellparty_time_changes() {
local Config = GlobalConfig.Get("深渊活动配置_nangua.json");
local time_slots = Config["深渊活动配置"]["活动时间段"];
// 将时间段按时间排序
local sorted_time_slots = [];
foreach(slot in time_slots) {
sorted_time_slots.append(slot);
}
// 按时间排序
for(local i = 0; i < sorted_time_slots.len() - 1; i++) {
for(local j = 0; j < sorted_time_slots.len() - 1 - i; j++) {
local time1 = sorted_time_slots[j]["开启时间"];
local time2 = sorted_time_slots[j + 1]["开启时间"];
if(time1[0] > time2[0] || (time1[0] == time2[0] && time1[1] > time2[1])) {
local temp = sorted_time_slots[j];
sorted_time_slots[j] = sorted_time_slots[j + 1];
sorted_time_slots[j + 1] = temp;
}
}
}
// 获取开放日期
local open_days = Config["深渊活动配置"]["每周几开放活动"];
local day_names = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"];
local open_days_text = "";
foreach(idx, day in open_days) {
open_days_text += day_names[day - 1];
if (idx < open_days.len() - 1) {
open_days_text += "、";
}
}
// 发送开放日期通知
World.SendNotiPacketMessage("【深渊探险活动】开放日期为: " + open_days_text, 14);
// 发送时间段通知
local time_text = "";
foreach(idx, slot in sorted_time_slots) {
local start_time = slot["开启时间"];
time_text += format("%02d:%02d", start_time[0], start_time[1]);
if (idx < sorted_time_slots.len() - 1) {
time_text += "、";
}
}
World.SendNotiPacketMessage("【深渊探险活动】开放时间为: " + time_text + ",敬请期待!", 14);
}
class Nangua_Hellparty {
function checkInventorySlot(SUser, itemid) {
local InvenObj = SUser.GetInven();
local type = Sq_CallFunc(S_Ptr("0x085018D2"), "int", ["pointer", "int"], InvenObj.C_Object, itemid);
local cnt = Sq_CallFunc(S_Ptr("0x08504F64"), "int", ["pointer", "int", "int"], InvenObj.C_Object, type, 1);
return cnt;
}
function api_CUser_Add_Item_list(SUser, item_list) {
for (local i = 0; i < item_list.len(); i++) {
local item_id = item_list[i][0]; // 道具代码
local quantity = item_list[i][1]; // 道具数量
local cnt = Nangua_Hellparty.checkInventorySlot(SUser, item_id);
if (cnt == 1) {
SUser.GiveItem(item_id, quantity); //使用窗口发送奖励
} else {
local RewardItems = [];
RewardItems.append([item_id, quantity]);
local title = "GM"
local Text = "由于背包空间不足,已通过邮件发送,请查收!"
//角色类 发送邮件函数 (标题, 正文, 金币, 道具列表[[3037,100],[3038,100]])
SUser.ReqDBSendMultiMail(title, Text, 0, RewardItems)
}
}
Nangua_Hellparty.SendItemWindowNotification(SUser, item_list);
}
function SendItemWindowNotification(SUser, item_list) {
local Pack = Packet();
Pack.Put_Header(1, 163); //协议
Pack.Put_Byte(1); //默认1
Pack.Put_Short(0); //槽位id 填入0即可
Pack.Put_Int(0); //未知 0以上即可
Pack.Put_Short(item_list.len()); //道具组数
//写入道具代码和道具数量
for (local i = 0; i < item_list.len(); i++) {
Pack.Put_Int(item_list[i][0]); //道具代码
Pack.Put_Int(item_list[i][1]); //道具数量 装备/时装时 任意均可
}
Pack.Finalize(true); //确定发包内容
SUser.Send(Pack); //发包
Pack.Delete(); //清空buff区
}
}