添加示例项目

This commit is contained in:
2026-04-16 16:27:53 +08:00
parent 69a2141804
commit 721fb5a992
192 changed files with 10148 additions and 0 deletions

View File

@@ -0,0 +1,954 @@
// 深渊活动状态枚举
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区
}
}