1111
This commit is contained in:
11
OfficialProject/一键存入个人金库/Proj.ifo
Normal file
11
OfficialProject/一键存入个人金库/Proj.ifo
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"ProjectName": "一键存入个人金库",
|
||||
"ProjectDescribe": "使用之前,请务必保证安装了群内的 \"客户端消息框233.dll\" 插件,这个插件放入你客户端的插件加载目录即可,在游戏中输入 //yjcc 即可一键存入个人金库,也可以在游戏中的快捷喊话中添加为快捷键 配置中可更改 yjcc 关键字",
|
||||
"ProjectAuthor": "倾泪寒 & 南瓜",
|
||||
"ProjectVersion": 1.0,
|
||||
"ProjectConfig": "一键存入个人金库_Lenheart.json",
|
||||
"ProjectFiles": [
|
||||
"一键入库.nut"
|
||||
],
|
||||
"ProjectRunFunc": "_Dps_OneClickStorage_Main_"
|
||||
}
|
||||
108
OfficialProject/一键存入个人金库/一键入库.nut
Normal file
108
OfficialProject/一键存入个人金库/一键入库.nut
Normal file
@@ -0,0 +1,108 @@
|
||||
/*
|
||||
文件名:一键入库.nut
|
||||
路径:MyProject/一键入库.nut
|
||||
创建日期:2025-03-25 14:42
|
||||
文件用途:一键入库
|
||||
*/
|
||||
|
||||
//启动函数 自定义的需要写在ifo中
|
||||
function _Dps_OneClickStorage_Main_() {
|
||||
local Config = GlobalConfig.Get("一键存入个人金库_Lenheart.json");
|
||||
//在游戏中输入//一键入库即可调用
|
||||
Gm_InputFunc_Handle[Config["一键存仓命令"]] <- function(SUser,Cmd) {
|
||||
// 获取角色背包
|
||||
local InvenObj = SUser.GetInven();
|
||||
// 角色仓库
|
||||
local CargoObj = Sq_CallFunc(S_Ptr("0x08151a94"), "pointer", ["pointer"], SUser.C_Object);
|
||||
// 添加计数器
|
||||
local transferCount = 0;
|
||||
// 遍历背包消耗品栏及材料栏
|
||||
for (local i = 57; i <= 152; ++i) {
|
||||
// 获取背包物品
|
||||
local ItemObj = InvenObj.GetSlot(1, i);
|
||||
// 获取背包物品ID
|
||||
local Item_Id = ItemObj.GetIndex();
|
||||
local ItemName = PvfItem.GetNameById(Item_Id);
|
||||
// 如果物品ID为0或3037,跳过(在此可以添加其他需要跳过的物品ID)
|
||||
if (Item_Id == 0 || Item_Id == 3037) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// 角色仓库是否存在背包物品
|
||||
local CargoSlot = Sq_CallFunc(S_Ptr("0x850bc14"), "int", ["pointer", "int"], CargoObj, Item_Id);
|
||||
// 如果角色仓库中没有该物品,跳过
|
||||
if (CargoSlot == -1) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// 获取仓库物品指针
|
||||
local cargoItemPointer = NativePointer(CargoObj).add(4).readPointer();
|
||||
// 获取角色仓库物品对象
|
||||
local cargoItemObj = NativePointer(cargoItemPointer).add(61 * CargoSlot);
|
||||
// 获取角色仓库物品ID
|
||||
local cargoItemId = NativePointer(cargoItemPointer).add(61 * CargoSlot + 2).readU32();
|
||||
// 获取角色仓库物品数量
|
||||
local cargoItemCount = Sq_CallFunc(S_Ptr("0x80F783A"), "int", ["pointer"], cargoItemObj.C_Object);
|
||||
|
||||
// 获取物品对象
|
||||
local PvfItem = PvfItem.GetPvfItemById(cargoItemId);
|
||||
|
||||
// 获取物品可堆叠数量
|
||||
local getStackableLimit = Sq_CallFunc(S_Ptr("0x0822C9FC"), "int", ["pointer"], PvfItem.C_Object);
|
||||
|
||||
// 如果仓库已达堆叠上限,跳过此物品
|
||||
if (cargoItemCount >= getStackableLimit) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// 获取背包物品数量
|
||||
local inventoryItemCount = Sq_CallFunc(S_Ptr("0x80F783A"), "int", ["pointer"], ItemObj.C_Object);
|
||||
// 获取物品是否可堆叠
|
||||
local checkStackableLimit = Sq_CallFunc(S_Ptr("0x08501A79"), "int", ["int", "int"], cargoItemId, cargoItemCount + inventoryItemCount);
|
||||
// 尝试将物品储存至角色仓库中
|
||||
local tryAddStackItem = Sq_CallFunc(S_Ptr("0x0850B4B0"), "int", ["pointer", "pointer", "int"], CargoObj, ItemObj.C_Object, CargoSlot);
|
||||
if (tryAddStackItem >= 0) {
|
||||
// 正式将物品插入角色仓库中
|
||||
Sq_CallFunc(S_Ptr("0x850b672"), "pointer", ["pointer", "pointer", "int"], CargoObj, ItemObj.C_Object, CargoSlot);
|
||||
// 删除背包中的物品
|
||||
ItemObj.Delete();
|
||||
transferCount++;
|
||||
SUser.SendNotiPacketMessage("[ " + ItemName + " ]" + "成功入库 x " + inventoryItemCount, 8);
|
||||
}
|
||||
|
||||
// 处理可堆叠物品
|
||||
if (checkStackableLimit == 0) {
|
||||
// 获取物品总数
|
||||
local totalCount = cargoItemCount + inventoryItemCount;
|
||||
|
||||
// 如果总数不超过上限,全部堆到仓库
|
||||
if (totalCount <= getStackableLimit) {
|
||||
// 将物品堆到仓库
|
||||
Sq_CallFunc(S_Ptr("0x80CB884"), "int", ["pointer", "int"], cargoItemObj.C_Object, totalCount);
|
||||
// 删除背包中的物品
|
||||
ItemObj.Delete();
|
||||
transferCount++;
|
||||
SUser.SendNotiPacketMessage("[ " + ItemName + " ]" + "成功入库 x " + inventoryItemCount, 8);
|
||||
} else {
|
||||
// 如果总数超过上限
|
||||
// 将仓库的物品数量设置为最大数量
|
||||
Sq_CallFunc(S_Ptr("0x80CB884"), "int", ["pointer", "int"], cargoItemObj.C_Object, getStackableLimit);
|
||||
// 将背包数量减去转移至仓库的数量
|
||||
local transferAmount = getStackableLimit - cargoItemCount;
|
||||
Sq_CallFunc(S_Ptr("0x80CB884"), "int", ["pointer", "int"], ItemObj.C_Object, totalCount - getStackableLimit);
|
||||
transferCount++;
|
||||
SUser.SendNotiPacketMessage("[ " + ItemName + " ]" + "成功入库 x " + transferAmount, 8);
|
||||
}
|
||||
}
|
||||
|
||||
// 通知客户端更新背包
|
||||
SUser.SendUpdateItemList(1, 0, i);
|
||||
}
|
||||
|
||||
if (transferCount == 0) {
|
||||
SUser.SendNotiBox("没有可转移的物品!", 1);
|
||||
}
|
||||
// 通知客户端更新仓库
|
||||
SUser.SendItemSpace(2);
|
||||
}
|
||||
}
|
||||
12
OfficialProject/任务清除卷/Proj.ifo
Normal file
12
OfficialProject/任务清除卷/Proj.ifo
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"ProjectName": "任务清除卷",
|
||||
"ProjectDescribe": "清理各类型任务以及重置相关任务",
|
||||
"ProjectAuthor": "南瓜",
|
||||
"ProjectVersion": 1.0,
|
||||
"ProjectConfig": "任务相关配置_南瓜.json",
|
||||
"ProjectFiles": [
|
||||
"任务清除卷.nut"
|
||||
],
|
||||
"ProjectIcon":"http://103.36.223.176:5244/d/DP_S/logo2.png?sign=aH3AjsyJgmomCqT3To_QfDY6a2RlSI-T3eUmtW0raoA=:0",
|
||||
"ProjectRunFunc": "_Dps_QuestInfo_nangua_Main_"
|
||||
}
|
||||
212
OfficialProject/任务清除卷/任务清除卷.nut
Normal file
212
OfficialProject/任务清除卷/任务清除卷.nut
Normal file
@@ -0,0 +1,212 @@
|
||||
_NG_QUEST_GRADE_COMMON_UNIQUE <- 5 //普通任务
|
||||
_NG_QUEST_GRADE_EPIC <- 0 //主线任务
|
||||
_NG_QUEST_GRADE_ACHIEVEMENT <- 2 //成就任务
|
||||
|
||||
// 任务类型与排除列表的映射
|
||||
_QUEST_EXCLUDE_MAP <- {
|
||||
[_NG_QUEST_GRADE_COMMON_UNIQUE] = "普通任务需排除任务ID",
|
||||
[_NG_QUEST_GRADE_ACHIEVEMENT] = "成就任务需排除任务ID",
|
||||
[_NG_QUEST_GRADE_EPIC] = "主线任务需排除任务ID"
|
||||
}
|
||||
|
||||
function clear_all_quest_by_character_level_nangua(SUser, Item_id) {
|
||||
local Cofig = GlobalConfig.Get("任务相关配置_南瓜.json");
|
||||
local poolMapping = {
|
||||
[Cofig["主线任务完成券道具ID"]] = _NG_QUEST_GRADE_EPIC,
|
||||
[Cofig["普通任务完成券道具ID"]] = _NG_QUEST_GRADE_COMMON_UNIQUE,
|
||||
[Cofig["成就任务完成券道具ID"]] = _NG_QUEST_GRADE_ACHIEVEMENT
|
||||
};
|
||||
// 获取对应的type
|
||||
local quest_type = poolMapping[Item_id];
|
||||
// 玩家任务信息
|
||||
local user_quest = SUser.GetQuest();
|
||||
|
||||
// 玩家已完成任务信息
|
||||
local WongWork_CQuestClear = NativePointer(user_quest).add(4);
|
||||
// 玩家当前等级
|
||||
local charac_lv = SUser.GetCharacLevel();
|
||||
// 本次完成任务数量
|
||||
local clear_quest_cnt = 0;
|
||||
// 获取pvf数据
|
||||
local data_manager = Sq_CallFunc(S_Ptr("0x80CC19B"), "pointer");
|
||||
|
||||
// 使用全局排除列表
|
||||
local exclude_quset_id = _QUEST_EXCLUDE_MAP.rawin(quest_type) ? Cofig[_QUEST_EXCLUDE_MAP[quest_type]] : [];
|
||||
|
||||
//完成当前已接任务
|
||||
for (local i = 0; i < 20; i++) {
|
||||
// 任务id
|
||||
local doing_quest_id = NativePointer(user_quest).add(4 * (i + 7500 + 2)).readInt();
|
||||
|
||||
if (doing_quest_id > 0) {
|
||||
// 获取当前任务的数据
|
||||
local quest = Sq_CallFunc(S_Ptr("0x835FDC6"), "pointer", ["pointer", "int"], data_manager, doing_quest_id);
|
||||
if (quest) {
|
||||
// 任务类型
|
||||
local quest_grade = NativePointer(quest).add(8).readInt();
|
||||
|
||||
// 判断任务类型并且不在排除列表中
|
||||
if (quest_grade == quest_type && exclude_quset_id.find(doing_quest_id) == null) {
|
||||
// 无条件完成任务
|
||||
SUser.ClearQuest_Gm(doing_quest_id);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 遍历所有任务ID
|
||||
for (local quest_id = 1; quest_id < 30000; quest_id++) {
|
||||
// 检查任务是否在排除列表中
|
||||
if (exclude_quset_id.find(quest_id) != null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// 跳过已完成的任务
|
||||
local isCleared = isClearedQuest(WongWork_CQuestClear.C_Object, quest_id);
|
||||
if (isCleared) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// 获取任务数据
|
||||
local quest = Sq_CallFunc(S_Ptr("0x835FDC6"), "pointer", ["pointer", "int"], data_manager, quest_id);
|
||||
if (quest) {
|
||||
// 任务类型
|
||||
local quest_grade = NativePointer(quest).add(8).readInt();
|
||||
|
||||
if (quest_grade == quest_type) {
|
||||
// 只判断任务最低等级要求 忽略 职业/前置 等任务要求 可一次性完成当前等级所有任务
|
||||
local quest_min_lv = NativePointer(quest).add(0x20).readInt();
|
||||
|
||||
if (quest_min_lv <= charac_lv) {
|
||||
Sq_CallFunc(S_Ptr("0x808BA78"), "int", ["pointer", "int"], WongWork_CQuestClear.C_Object, quest_id);
|
||||
|
||||
// 本次自动完成任务计数
|
||||
clear_quest_cnt++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 通知客户端更新
|
||||
if (clear_quest_cnt > 0) {
|
||||
local Pack = Packet();
|
||||
Sq_CallFunc(S_Ptr("0x868B044"), "int", ["pointer"], SUser.C_Object);
|
||||
Sq_CallFunc(S_Ptr("0x86ABBA8"), "int", ["pointer", "pointer"], user_quest, Pack.C_Object);
|
||||
SUser.Send(Pack);
|
||||
Pack.Delete();
|
||||
// 公告通知客户端本次自动完成任务数据
|
||||
SUser.SendNotiPacketMessage("已自动完成当前等级任务数量: " + clear_quest_cnt, 8);
|
||||
}else{
|
||||
SUser.SendNotiPacketMessage("没有可清理的任务", 8);
|
||||
SUser.GiveItem(Item_id, 1);
|
||||
}
|
||||
}
|
||||
|
||||
//指定每日任务完成券
|
||||
function QUEST_ByMRFuncBynangua(SUser, ItemId) {
|
||||
|
||||
// 玩家已完成任务信息
|
||||
local user_quest = SUser.GetQuest();
|
||||
local WongWork_CQuestClear = NativePointer(user_quest).add(4);
|
||||
|
||||
// 是否有任务已被清理
|
||||
local anyTaskCleared = false;
|
||||
|
||||
// 遍历并完成每一个任务
|
||||
for (local i = 0; i < questConfigBynangua.CF.len(); i++) {
|
||||
local quest_id = questConfigBynangua.CF[i];
|
||||
local isCleared = isClearedQuest(WongWork_CQuestClear.C_Object, quest_id);
|
||||
|
||||
if (isCleared) {
|
||||
continue;
|
||||
} else {
|
||||
SUser.ClearQuest_Gm(quest_id);
|
||||
anyTaskCleared = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (anyTaskCleared) {
|
||||
SUser.SendNotiPacketMessage("指定每日任务已完成!", 8);
|
||||
} else {
|
||||
SUser.SendNotiPacketMessage("没有可清理的任务", 8);
|
||||
SUser.GiveItem(ItemId, 1);
|
||||
}
|
||||
}
|
||||
|
||||
//指定每日任务重置券
|
||||
function QUEST_ByCZMRFuncBynangua(SUser, ItemId) {
|
||||
// 玩家已完成任务信息
|
||||
local user_quest = SUser.GetQuest();
|
||||
local WongWork_CQuestClear = NativePointer(user_quest).add(4);
|
||||
|
||||
// 是否有任务被重置
|
||||
local anyTaskReset = false;
|
||||
|
||||
// 遍历并重置每一个任务
|
||||
for (local i = 0; i < questConfigBynangua.CF.len(); i++) {
|
||||
local quest_id = questConfigBynangua.CF[i];
|
||||
local isCleared = isClearedQuest(WongWork_CQuestClear.C_Object, quest_id);
|
||||
|
||||
if (!isCleared) {
|
||||
continue;
|
||||
} else {
|
||||
Sq_CallFunc(S_Ptr("0x808BAAC"), "int", ["pointer", "int"], WongWork_CQuestClear.C_Object, quest_id);
|
||||
anyTaskReset = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (anyTaskReset) {
|
||||
//通知客户端更新任务列表
|
||||
Sq_CallFunc(S_Ptr("0x868B044"), "int", ["pointer"], SUser.C_Object);
|
||||
local Pack = Packet();
|
||||
Sq_CallFunc(S_Ptr("0x86ABBA8"), "int", ["pointer", "pointer"], user_quest, Pack.C_Object);
|
||||
SUser.Send(Pack);
|
||||
Pack.Delete();
|
||||
SUser.SendNotiPacketMessage("指定每日任务已重置!", 8);
|
||||
} else {
|
||||
SUser.SendNotiPacketMessage("没有可重置的任务", 8);
|
||||
SUser.GiveItem(ItemId, 1);
|
||||
}
|
||||
}
|
||||
|
||||
//重置所有任务为未完成状态
|
||||
function QUEST_ByALLFuncBynangua(SUser, ItemId) {
|
||||
local GetState = SUser.GetState()
|
||||
local user_quest = SUser.GetQuest();
|
||||
local WongWork_CQuestClear = NativePointer(user_quest).add(4);
|
||||
//清空已接任务列表
|
||||
for (local i = 0; i < 20; i++) {
|
||||
NativePointer(user_quest).add(4 * (i + 7500 + 2)).writeInt(0);
|
||||
}
|
||||
//所有任务设置未完成状态
|
||||
for (local i = 0; i < 29999; i++) {
|
||||
Sq_CallFunc(S_Ptr("0x808BAAC"), "int", ["pointer", "int"], WongWork_CQuestClear.C_Object, i);
|
||||
}
|
||||
//通知客户端更新任务列表
|
||||
Sq_CallFunc(S_Ptr("0x868B044"), "int", ["pointer"], SUser.C_Object);
|
||||
local Pack = Packet();
|
||||
Sq_CallFunc(S_Ptr("0x86ABBA8"), "int", ["pointer", "pointer"], user_quest, Pack.C_Object);
|
||||
SUser.Send(Pack);
|
||||
Pack.Delete();
|
||||
SUser.SendNotiPacketMessage("所有任务已重置!", 8);
|
||||
}
|
||||
|
||||
function isClearedQuest(C_Object, questID) {
|
||||
return Sq_CallFunc(S_Ptr("0x808BAE0"), "bool", ["pointer", "int"], C_Object, questID);
|
||||
}
|
||||
|
||||
function _Dps_QuestInfo_nangua_Main_() {
|
||||
local Cofig = GlobalConfig.Get("任务相关配置_南瓜.json");
|
||||
// 主线任务完成券
|
||||
Cb_Use_Item_Sp_Func[Cofig["主线任务完成券道具ID"]] <- clear_all_quest_by_character_level_nangua;
|
||||
// 普通任务完成券
|
||||
Cb_Use_Item_Sp_Func[Cofig["普通任务完成券道具ID"]] <- clear_all_quest_by_character_level_nangua;
|
||||
// 成就任务完成券
|
||||
Cb_Use_Item_Sp_Func[Cofig["成就任务完成券道具ID"]] <- clear_all_quest_by_character_level_nangua;
|
||||
// 每日任务完成券
|
||||
Cb_Use_Item_Sp_Func[Cofig["指定每日任务完成券道具ID"]] <- QUEST_ByMRFuncBynangua;
|
||||
// 每日任务重置券
|
||||
Cb_Use_Item_Sp_Func[Cofig["指定每日任务重置券道具ID"]] <- QUEST_ByCZMRFuncBynangua;
|
||||
// 所有任务重置券
|
||||
Cb_Use_Item_Sp_Func[Cofig["重置所有任务道具ID"]] <- QUEST_ByALLFuncBynangua;
|
||||
}
|
||||
11
OfficialProject/副本播报/Proj.ifo
Normal file
11
OfficialProject/副本播报/Proj.ifo
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"ProjectName": "副本播报",
|
||||
"ProjectDescribe": "通关及未通关时播报耗时时长",
|
||||
"ProjectAuthor": "南瓜",
|
||||
"ProjectVersion": 1.0,
|
||||
"ProjectConfig": "副本播报配置_Nangua.json",
|
||||
"ProjectFiles": [
|
||||
"副本播报.nut"
|
||||
],
|
||||
"ProjectRunFunc": "_Dps_send_dungeon_msg_Main_"
|
||||
}
|
||||
193
OfficialProject/副本播报/副本播报.nut
Normal file
193
OfficialProject/副本播报/副本播报.nut
Normal file
@@ -0,0 +1,193 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
11
OfficialProject/史诗药剂/Proj.ifo
Normal file
11
OfficialProject/史诗药剂/Proj.ifo
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"ProjectName": "史诗药剂",
|
||||
"ProjectDescribe": "通过指定ID的道具,使玩家获得爆率加成。",
|
||||
"ProjectAuthor": "倾泪寒 & 南瓜",
|
||||
"ProjectVersion": 1.4,
|
||||
"ProjectConfig": "史诗药剂配置文件.json",
|
||||
"ProjectFiles": [
|
||||
"史诗药剂.nut"
|
||||
],
|
||||
"ProjectRunFunc": "_Dps_EpicPotion_Main_"
|
||||
}
|
||||
42
OfficialProject/史诗药剂/史诗药剂.nut
Normal file
42
OfficialProject/史诗药剂/史诗药剂.nut
Normal file
@@ -0,0 +1,42 @@
|
||||
/*
|
||||
文件名:史诗药剂.nut
|
||||
路径:MyProject/史诗药剂.nut
|
||||
创建日期:2025-03-28 10:21
|
||||
文件用途:史诗药剂
|
||||
*/
|
||||
|
||||
//启动函数 自定义的需要写在ifo中
|
||||
function _Dps_EpicPotion_Main_() {
|
||||
//注册获取道具稀有度进入回调
|
||||
Cb_GetItemRarity_Enter_Func["史诗药剂_逻辑"] <- function(args) {
|
||||
local Cofig = GlobalConfig.Get("史诗药剂配置文件.json");
|
||||
local Addr = NativePointer(args[0]);
|
||||
local VectorSize = (Addr.add(4).readU32() - Addr.readU32()) / 4;
|
||||
// 遍历队伍成员,找到使用了史诗药剂的玩家
|
||||
local userWithPotion = null;
|
||||
for (local i = 0; i< VectorSize; i++) {
|
||||
local elementAddr = NativePointer(Addr.readPointer()).add(i * 4);
|
||||
local user = elementAddr.readPointer();
|
||||
if (user && Sq_CallFunc(S_Ptr("0x865E994"), "int", ["pointer", "int"], user, Cofig.EpicPotionID)) {
|
||||
userWithPotion = User(user);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (userWithPotion && Haker.NextReturnAddress == "0x853583a") {
|
||||
local partyobj = userWithPotion.GetParty();
|
||||
// 检查是否单人
|
||||
if (Sq_CallFunc(S_Ptr("0x0859A16A"), "int", ["pointer", ], partyobj.C_Object) == 1) {
|
||||
local MaxRoll = NativePointer(args[1]).add(16).readU32();
|
||||
local odds = Cofig.EpicPotionOdds; // 默认药剂的增加几率
|
||||
// 检查是否VIP玩家
|
||||
local charac_no = userWithPotion.GetCID();
|
||||
if (Cofig.EpicPotionlist.rawin(charac_no)) {
|
||||
odds = Cofig.EpicPotionlist[charac_no];
|
||||
}
|
||||
// 计算新的roll值
|
||||
args[2] = MathClass.getMin(args[2] + args[2] * odds, MaxRoll);
|
||||
}
|
||||
}
|
||||
return args;
|
||||
}
|
||||
}
|
||||
11
OfficialProject/时装与宠物清除卷/Proj.ifo
Normal file
11
OfficialProject/时装与宠物清除卷/Proj.ifo
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"ProjectName": "时装与宠物清除卷",
|
||||
"ProjectDescribe": "通过指定ID的道具,将装备背包第前两行的时装或宠物清除。",
|
||||
"ProjectAuthor": "倾泪寒",
|
||||
"ProjectVersion": 1.2,
|
||||
"ProjectConfig": "时装与宠物清除卷_Lenheart.json",
|
||||
"ProjectFiles": [
|
||||
"时装与宠物清除卷.nut"
|
||||
],
|
||||
"ProjectRunFunc": "_Dps_FashionAndPetClearanceRoll_Main_"
|
||||
}
|
||||
54
OfficialProject/时装与宠物清除卷/时装与宠物清除卷.nut
Normal file
54
OfficialProject/时装与宠物清除卷/时装与宠物清除卷.nut
Normal file
@@ -0,0 +1,54 @@
|
||||
/*
|
||||
文件名:时装与宠物清除卷.nut
|
||||
路径:OfficialProject/时装与宠物清除卷/时装与宠物清除卷.nut
|
||||
创建日期:2025-04-01 21:42
|
||||
文件用途:
|
||||
*/
|
||||
function _Dps_FashionAndPetClearanceRoll_Main_() {
|
||||
local Cofig = GlobalConfig.Get("时装与宠物清除卷_Lenheart.json");
|
||||
//宠物删除
|
||||
Cb_Use_Item_Sp_Func[Cofig["宠物清除卷ID"]] <- function(SUser, ItemId) {
|
||||
if(Cofig["宠物清除券是否返还"])SUser.GiveItem(ItemId, 1);
|
||||
local Cid = SUser.GetCID();
|
||||
local InvenObj = SUser.GetInven();
|
||||
if (InvenObj) {
|
||||
for (local i = 0; i< 13; i++) {
|
||||
local ItemObj = InvenObj.GetSlot(3, i);
|
||||
local Flag = false;
|
||||
if (ItemObj) {
|
||||
ItemObj.Delete();
|
||||
}
|
||||
}
|
||||
local Sql = "delete from taiwan_cain_2nd.creature_items where charac_no=" + Cid + " and slot < 13 ;";
|
||||
local SqlObj = MysqlPool.GetInstance().GetConnect();
|
||||
SqlObj.Exec_Sql(Sql);
|
||||
//把连接还池子
|
||||
MysqlPool.GetInstance().PutConnect(SqlObj);
|
||||
SUser.SendItemSpace(7);
|
||||
SUser.SendNotiPacketMessage(Cofig["宠物清除完成提示"], 8);
|
||||
}
|
||||
}
|
||||
|
||||
//时装删除
|
||||
Cb_Use_Item_Sp_Func[Cofig["时装清除卷ID"]] <- function(SUser, ItemId) {
|
||||
if(Cofig["时装清除券是否返还"])SUser.GiveItem(ItemId, 1);
|
||||
local Cid = SUser.GetCID();
|
||||
local InvenObj = SUser.GetInven();
|
||||
if (InvenObj) {
|
||||
for (local i = 0; i< 13; i++) {
|
||||
local ItemObj = InvenObj.GetSlot(2, i);
|
||||
if (ItemObj) {
|
||||
ItemObj.Delete();
|
||||
}
|
||||
}
|
||||
local Sql = "delete from taiwan_cain_2nd.user_items where charac_no=" + Cid + " and slot >= 10 and slot <= 23";
|
||||
local SqlObj = MysqlPool.GetInstance().GetConnect();
|
||||
SqlObj.Exec_Sql(Sql);
|
||||
//把连接还池子
|
||||
MysqlPool.GetInstance().PutConnect(SqlObj);
|
||||
SUser.SendItemSpace(1);
|
||||
SUser.SendNotiPacketMessage(Cofig["时装清除完成提示"], 8);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
11
OfficialProject/服务器防入侵/Proj.ifo
Normal file
11
OfficialProject/服务器防入侵/Proj.ifo
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"ProjectName": "服务器防入侵",
|
||||
"ProjectDescribe": "本项目会持续更新,因特殊原因逻辑不会公开",
|
||||
"ProjectAuthor": "倾泪寒",
|
||||
"ProjectVersion": 1.0,
|
||||
"ProjectConfig": "",
|
||||
"ProjectFiles": [
|
||||
"服务器防入侵.sut"
|
||||
],
|
||||
"ProjectRunFunc": "_Dps_ServerIntrusionPrevention_Main_"
|
||||
}
|
||||
BIN
OfficialProject/服务器防入侵/服务器防入侵.sut
Normal file
BIN
OfficialProject/服务器防入侵/服务器防入侵.sut
Normal file
Binary file not shown.
11
OfficialProject/装备镶嵌与时装镶嵌/Proj.ifo
Normal file
11
OfficialProject/装备镶嵌与时装镶嵌/Proj.ifo
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"ProjectName": "装备镶嵌与时装镶嵌",
|
||||
"ProjectDescribe": "使用之前,请务必保证安装了群内的 \"客户端消息框233.dll\" 插件,这个插件放入你客户端的插件加载目录即可\n如果你是0627的客户端版本还需要安装群内的 \"0627装备镶嵌.dll\" 插件",
|
||||
"ProjectAuthor": "倾泪寒",
|
||||
"ProjectVersion": 1.2,
|
||||
"ProjectConfig": "装备镶嵌与时装镶嵌_Lenheart.json",
|
||||
"ProjectFiles": [
|
||||
"装备镶嵌与时装镶嵌.nut"
|
||||
],
|
||||
"ProjectRunFunc": "_Dps_Equ2AvaJewel_Main_"
|
||||
}
|
||||
590
OfficialProject/装备镶嵌与时装镶嵌/装备镶嵌与时装镶嵌.nut
Normal file
590
OfficialProject/装备镶嵌与时装镶嵌/装备镶嵌与时装镶嵌.nut
Normal file
@@ -0,0 +1,590 @@
|
||||
class EquimentUseJewel {
|
||||
|
||||
ExecUser = null;
|
||||
|
||||
//建库建表
|
||||
function CreateMysqlTable() {
|
||||
local CreateSql1 = "create database if not exists l_equ_jewel default charset utf8;"
|
||||
local CreateSql2 = "CREATE TABLE l_equ_jewel.equipment ( equ_id int(11) AUTO_INCREMENT, jewel_data blob NOT NULL,andonglishanbai_flag int(11),date VARCHAR(255), PRIMARY KEY (equ_id)) ENGINE=InnoDB DEFAULT CHARSET=utf8,AUTO_INCREMENT = 150;"
|
||||
local SqlObj = MysqlPool.GetInstance().GetConnect();
|
||||
SqlObj.Exec_Sql(CreateSql1);
|
||||
SqlObj.Exec_Sql(CreateSql2);
|
||||
MysqlPool.GetInstance().PutConnect(SqlObj);
|
||||
}
|
||||
|
||||
function api_get_jewel_socket_data(id) { //获取徽章数据,存在返回徽章数据,不存在返回空字节数据
|
||||
local CheckSql = "SELECT jewel_data FROM l_equ_jewel.equipment where equ_id = " + id + ";";
|
||||
//从池子拿连接
|
||||
local SqlObj = MysqlPool.GetInstance().GetConnect();
|
||||
local Ret = SqlObj.Select(CheckSql, ["binary"]);
|
||||
//把连接还池子
|
||||
MysqlPool.GetInstance().PutConnect(SqlObj);
|
||||
//没结婚要返回false
|
||||
if (Ret.len()< 1 || Ret[0][0] == null) {
|
||||
return 0;
|
||||
} else {
|
||||
return Ret[0][0];
|
||||
}
|
||||
}
|
||||
|
||||
function api_exitjeweldata(id) { //0代表不存在,存在返回1
|
||||
local CheckSql = "SELECT andonglishanbai_flag FROM l_equ_jewel.equipment where equ_id = " + id + ";";
|
||||
//从池子拿连接
|
||||
local SqlObj = MysqlPool.GetInstance().GetConnect();
|
||||
local Ret = SqlObj.Select(CheckSql, ["int"]);
|
||||
//把连接还池子
|
||||
MysqlPool.GetInstance().PutConnect(SqlObj);
|
||||
//没结婚要返回false
|
||||
if (Ret.len()< 1 || Ret[0][0] == null) {
|
||||
return 0;
|
||||
} else {
|
||||
return Ret[0][0];
|
||||
}
|
||||
}
|
||||
|
||||
function save_equiment_socket(socket_data, id) { //0代表不存在,存在返回1
|
||||
local CheckSql = "UPDATE l_equ_jewel.equipment SET jewel_data = 0x" + socket_data + " WHERE equ_id = " + id + ";";
|
||||
//从池子拿连接
|
||||
local SqlObj = MysqlPool.GetInstance().GetConnect();
|
||||
local Ret = SqlObj.Select(CheckSql, ["int"]);
|
||||
//把连接还池子
|
||||
MysqlPool.GetInstance().PutConnect(SqlObj);
|
||||
//没结婚要返回false
|
||||
if (Ret.len()< 1 || Ret[0][0] == null) {
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
function CUser_SendCmdErrorPacket(SUser, id, id2) {
|
||||
local Pack = Packet();
|
||||
Pack.Put_Header(1, id);
|
||||
Pack.Put_Byte(0);
|
||||
Pack.Put_Byte(id2);
|
||||
Pack.Finalize(true);
|
||||
SUser.Send(Pack);
|
||||
Pack.Delete();
|
||||
}
|
||||
|
||||
function api_PacketBuf_get_buf(packet_buf) {
|
||||
return NativePointer(NativePointer(packet_buf).add(20).readPointer()).add(13);
|
||||
}
|
||||
|
||||
function add_equiment_socket(equipment_type) { //0代表开孔失败 成功返回标识
|
||||
/*
|
||||
武器10
|
||||
称号11
|
||||
上衣12
|
||||
头肩13
|
||||
下衣14
|
||||
鞋子15
|
||||
腰带16
|
||||
项链17
|
||||
手镯18
|
||||
戒指19
|
||||
辅助装备20
|
||||
魔法石21
|
||||
*/
|
||||
|
||||
/*
|
||||
红色:'010000000000010000000000000000000000000000000000000000000000' A
|
||||
黄色:'020000000000020000000000000000000000000000000000000000000000' B
|
||||
绿色:'040000000000040000000000000000000000000000000000000000000000' C
|
||||
蓝色:'080000000000080000000000000000000000000000000000000000000000' D
|
||||
白金:'100000000000100000000000000000000000000000000000000000000000'
|
||||
*/
|
||||
local DB_JewelsocketData = "";
|
||||
switch (equipment_type) {
|
||||
case 10: //武器10 SS
|
||||
DB_JewelsocketData = "100000000000000000000000000000000000000000000000000000000000"
|
||||
break;
|
||||
case 11: //称号11 SS
|
||||
DB_JewelsocketData = "100000000000000000000000000000000000000000000000000000000000"
|
||||
break;
|
||||
case 12: //上衣12 C
|
||||
DB_JewelsocketData = "040000000000040000000000000000000000000000000000000000000000"
|
||||
break;
|
||||
case 13: //头肩13 B
|
||||
DB_JewelsocketData = "020000000000020000000000000000000000000000000000000000000000"
|
||||
break;
|
||||
case 14: //下衣14 C
|
||||
DB_JewelsocketData = "040000000000040000000000000000000000000000000000000000000000"
|
||||
break;
|
||||
case 15: //鞋子15 D
|
||||
DB_JewelsocketData = "080000000000080000000000000000000000000000000000000000000000"
|
||||
break;
|
||||
case 16: //腰带16 A
|
||||
DB_JewelsocketData = "010000000000010000000000000000000000000000000000000000000000"
|
||||
break;
|
||||
case 17: //项链17 B
|
||||
DB_JewelsocketData = "020000000000020000000000000000000000000000000000000000000000"
|
||||
break;
|
||||
case 18: //手镯18 D
|
||||
DB_JewelsocketData = "080000000000080000000000000000000000000000000000000000000000"
|
||||
break;
|
||||
case 19: //戒指19 A
|
||||
DB_JewelsocketData = "010000000000010000000000000000000000000000000000000000000000"
|
||||
break;
|
||||
case 20: //辅助装备20 S
|
||||
DB_JewelsocketData = "100000000000000000000000000000000000000000000000000000000000"
|
||||
break;
|
||||
case 21: //魔法石21 S
|
||||
DB_JewelsocketData = "100000000000000000000000000000000000000000000000000000000000"
|
||||
break;
|
||||
default:
|
||||
DB_JewelsocketData = "000000000000000000000000000000000000000000000000000000000000"
|
||||
break;
|
||||
}
|
||||
local date = time();
|
||||
local Ct = Sq_GetTimestampString();
|
||||
date = date.tostring() + Ct;
|
||||
|
||||
local CheckSql = "INSERT INTO l_equ_jewel.equipment (andonglishanbai_flag,jewel_data,date) VALUES(1,0x" + DB_JewelsocketData + ",\'" + date + "\');";
|
||||
local CheckSql1 = "SELECT equ_id FROM l_equ_jewel.equipment where date = \'" + date + "\';";
|
||||
//从池子拿连接
|
||||
local SqlObj = MysqlPool.GetInstance().GetConnect();
|
||||
SqlObj.Select(CheckSql, ["int"]);
|
||||
local Ret = SqlObj.Select(CheckSql1, ["int"]);
|
||||
//把连接还池子
|
||||
MysqlPool.GetInstance().PutConnect(SqlObj);
|
||||
if (Ret.len()< 1 || Ret[0][0] == null) {
|
||||
return 0;
|
||||
} else {
|
||||
return Ret[0][0];
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
function CStackableItem_getJewelTargetSocket(C_Object) {
|
||||
return Sq_CallFunc(S_Ptr("0x0822CA28"), "int", ["pointer"], C_Object);
|
||||
}
|
||||
|
||||
function CUser_SendUpdateItemList_DB(SUser, Slot, DB_JewelSocketData) {
|
||||
local Pack = Packet();
|
||||
Pack.Put_Header(0, 14);
|
||||
Pack.Put_Byte(0);
|
||||
Pack.Put_Short(1);
|
||||
local InvenObj = SUser.GetInven();
|
||||
Sq_CallFunc(S_Ptr("0x084FC6BC"), "int", ["pointer", "int", "int", "pointer"], InvenObj.C_Object, 1, Slot, Pack.C_Object);
|
||||
Pack.Put_BinaryEx(DB_JewelSocketData.C_Object, 30);
|
||||
Pack.Finalize(true);
|
||||
SUser.Send(Pack);
|
||||
Pack.Delete();
|
||||
}
|
||||
|
||||
function GetByte(value) {
|
||||
local Blob = blob();
|
||||
Blob.writen(value, 'w');
|
||||
return Blob;
|
||||
}
|
||||
|
||||
function intToHex(num) {
|
||||
if (num == 0) {
|
||||
return "0";
|
||||
}
|
||||
local hexDigits = "0123456789abcdef";
|
||||
local hexString = "";
|
||||
while (num > 0) {
|
||||
local remainder = num % 16;
|
||||
hexString = hexDigits[remainder] + hexString;
|
||||
num = (num / 16).tointeger();
|
||||
}
|
||||
return hexString;
|
||||
}
|
||||
|
||||
function lengthCutting(str, ystr, num, maxLength) {
|
||||
// 如果字符串长度小于最大长度,在前面补0
|
||||
local lengthDiff = maxLength - str.len();
|
||||
if (lengthDiff > 0) {
|
||||
local zeroPadding = "";
|
||||
for (local i = 0; i< lengthDiff; i++) {
|
||||
zeroPadding += "0";
|
||||
}
|
||||
str = zeroPadding + str;
|
||||
}
|
||||
local strArr = "";
|
||||
for (local i = 0; i< str.len(); i += num) {
|
||||
local endIndex = i + num;
|
||||
if (endIndex > str.len()) {
|
||||
endIndex = str.len();
|
||||
}
|
||||
strArr += str.slice(i, endIndex);
|
||||
}
|
||||
return ystr + strArr;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function HackAddSocketToAvatarLogic(Flag) {
|
||||
if (Flag) {
|
||||
Sq_WriteByteArr(S_Ptr("821A449"), [0x90, 0x90]);
|
||||
Sq_WriteByteArr(S_Ptr("0x821A44B"), array(36, 0x90));
|
||||
} else {
|
||||
Sq_WriteByteArr(S_Ptr("821A449"), [0x74, 0x2B]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
function FixFunction() {
|
||||
//称号回包
|
||||
Cb_CTitleBook_putItemData_Leave_Func.EquimentUseJewel <- function(args) {
|
||||
local JewelSocketData = api_get_jewel_socket_data(NativePointer(args[3]).add(25).readU32());
|
||||
local ret = args.pop();
|
||||
if (JewelSocketData && NativePointer(JewelSocketData).add(0).readU8() != 0) {
|
||||
local Pack = Packet(args[1]);
|
||||
Pack.Put_BinaryEx(JewelSocketData.C_Object, 30);
|
||||
}
|
||||
return null;
|
||||
}.bindenv(this);
|
||||
|
||||
//设计图继承
|
||||
Cb_CUsercopyItemOption_Enter_Func.EquimentUseJewel <- function(args) {
|
||||
local jewelSocketID = NativePointer(args[2]).add(25).readU32();
|
||||
NativePointer(args[1]).add(25).writeU32(jewelSocketID);
|
||||
return null;
|
||||
}.bindenv(this);
|
||||
|
||||
//装备开孔
|
||||
Cb_AddSocketToAvatar_Enter_Func.EquimentUseJewel <- function(args) {
|
||||
local SUser = User(args[1]);
|
||||
local PackCopyBuffer = Memory.alloc(10001);
|
||||
Memory.copy(PackCopyBuffer, NativePointer(args[2]), 1000);
|
||||
local Pack = Packet(PackCopyBuffer.C_Object);
|
||||
local equ_slot = Pack.GetShort();
|
||||
local equitem_id = Pack.GetInt();
|
||||
local sta_slot = Pack.GetShort();
|
||||
local CurCharacInvenW = SUser.GetInven();
|
||||
local inven_item = CurCharacInvenW.GetSlot(1, equ_slot);
|
||||
|
||||
if (equ_slot > 56) { //修改后:大于56则是时装装备 原:如果不是装备文件就调用原逻辑
|
||||
equ_slot = equ_slot - 57;
|
||||
local C_PacketBuf = api_PacketBuf_get_buf(args[2]) //获取原始封包数据
|
||||
C_PacketBuf.add(0).writeShort(equ_slot) //修改掉装备位置信息 时装类镶嵌从57开始。
|
||||
|
||||
//执行原逻辑
|
||||
return null;
|
||||
}
|
||||
//如果已开启镶嵌槽则不执行
|
||||
local equ_id = NativePointer(inven_item.C_Object).add(25).readU32();
|
||||
if (api_exitjeweldata(equ_id)) {
|
||||
CUser_SendCmdErrorPacket(SUser, 209, 19);
|
||||
HackAddSocketToAvatarLogic(true);
|
||||
return null;
|
||||
}
|
||||
|
||||
local item = PvfItem.GetPvfItemById(equitem_id);
|
||||
local ItemType = Sq_CallFunc(S_Ptr("0x08514D26"), "int", ["pointer"], item.C_Object);
|
||||
|
||||
if (ItemType == 10) {
|
||||
SUser.SendNotiBox("装备为武器类型,不支持打孔!", 1)
|
||||
CUser_SendCmdErrorPacket(SUser, 209, 0);
|
||||
HackAddSocketToAvatarLogic(true);
|
||||
return null;
|
||||
} else if (ItemType == 11) {
|
||||
SUser.SendNotiBox("装备为称号类型,不支持打孔!", 1)
|
||||
CUser_SendCmdErrorPacket(SUser, 209, 0);
|
||||
HackAddSocketToAvatarLogic(true);
|
||||
return null;
|
||||
}
|
||||
|
||||
local id = add_equiment_socket(ItemType);
|
||||
|
||||
Sq_Inven_RemoveItemFormCount(CurCharacInvenW.C_Object, 1, sta_slot, 1, 8, 1); //删除打孔道具
|
||||
NativePointer(inven_item.C_Object).add(25).writeU32(id) //写入槽位标识
|
||||
SUser.SendUpdateItemList(1, 0, equ_slot);
|
||||
|
||||
local JewelSocketData = api_get_jewel_socket_data(id);
|
||||
CUser_SendUpdateItemList_DB(SUser, equ_slot, JewelSocketData); //用于更新镶嵌后的装备显示,这里用的是带镶嵌数据的更新背包函数,并非CUser_SendUpdateItemList
|
||||
|
||||
local Pack = Packet();
|
||||
Pack.Put_Header(1, 209);
|
||||
Pack.Put_Byte(1);
|
||||
Pack.Put_Short(equ_slot + 104);
|
||||
Pack.Put_Short(sta_slot);
|
||||
Pack.Finalize(true);
|
||||
SUser.Send(Pack);
|
||||
Pack.Delete();
|
||||
HackAddSocketToAvatarLogic(true);
|
||||
return null;
|
||||
}.bindenv(this);
|
||||
|
||||
Cb_AddSocketToAvatar_Leave_Func.EquimentUseJewel <- function(args) {
|
||||
HackAddSocketToAvatarLogic(false);
|
||||
return null;
|
||||
}.bindenv(this);
|
||||
|
||||
//装备镶嵌和时装镶嵌
|
||||
Cb_Dispatcher_UseJewel_Enter_Func.EquimentUseJewel <- function(args) {
|
||||
local SUser = User(args[1]);
|
||||
local Pack = Packet(args[2]);
|
||||
local PackIndex = NativePointer(args[2]).add(4).readInt();
|
||||
local State = SUser.GetState();
|
||||
if (State != 3) return null;
|
||||
|
||||
local avartar_inven_slot = Pack.GetShort();
|
||||
local avartar_item_id = Pack.GetInt();
|
||||
local emblem_cnt = Pack.GetByte();
|
||||
|
||||
//下面是参照原时装镶嵌的思路写的。个别点标记出来。
|
||||
if (avartar_inven_slot > 104) {
|
||||
local equipment_inven_slot = avartar_inven_slot - 104; //取出真实装备所在背包位置值
|
||||
local Inven = SUser.GetInven();
|
||||
local equipment = Inven.GetSlot(1, equipment_inven_slot);
|
||||
//校验是否合法
|
||||
if (!equipment || equipment.IsEmpty || (equipment.GetIndex() != avartar_item_id) || SUser.CheckItemLock(1, equipment_inven_slot)) return;
|
||||
|
||||
local id = NativePointer(equipment.C_Object).add(25).readU32();
|
||||
local JewelSocketData = api_get_jewel_socket_data(id);
|
||||
if (!JewelSocketData) return;
|
||||
|
||||
local emblems = {};
|
||||
if (emblem_cnt <= 3) {
|
||||
for (local i = 0; i< emblem_cnt; i++) {
|
||||
local emblem_inven_slot = Pack.GetShort();
|
||||
local emblem_item_id = Pack.GetInt();
|
||||
local equipment_socket_slot = Pack.GetByte();
|
||||
local emblem = Inven.GetSlot(1, emblem_inven_slot);
|
||||
//校验徽章及插槽数据是否合法
|
||||
if (!emblem || emblem.IsEmpty || (emblem.GetIndex() != emblem_item_id) || (equipment_socket_slot >= 3)) return;
|
||||
|
||||
//校验徽章是否满足时装插槽颜色要求
|
||||
//获取徽章pvf数据
|
||||
local citem = PvfItem.GetPvfItemById(emblem_item_id);
|
||||
if (!citem) return;
|
||||
|
||||
//校验徽章类型
|
||||
if (!citem.IsStackable() || citem.GetItemType() != 20) return;
|
||||
|
||||
//获取徽章支持的插槽
|
||||
local emblem_socket_type = CStackableItem_getJewelTargetSocket(citem.C_Object);
|
||||
//获取要镶嵌的时装插槽类型
|
||||
local avartar_socket_type = JewelSocketData.add(equipment_socket_slot * 6).readShort();
|
||||
|
||||
if (!(emblem_socket_type & avartar_socket_type)) {
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
emblems[equipment_socket_slot] <- [emblem_inven_slot, emblem_item_id];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
foreach(equipment_socket_slot, emblemObject in emblems) {
|
||||
//删除徽章
|
||||
local emblem_inven_slot = emblemObject[0];
|
||||
Sq_Inven_RemoveItemFormCount(Inven.C_Object, 1, emblem_inven_slot, 1, 8, 1); //删除打孔道具
|
||||
//设置时装插槽数据
|
||||
local emblem_item_id = emblemObject[1];
|
||||
JewelSocketData.add(2 + 6 * equipment_socket_slot).writeU32(emblem_item_id);
|
||||
}
|
||||
|
||||
local Buf = Sq_Point2Blob(JewelSocketData.C_Object, 30);
|
||||
local Str = "";
|
||||
foreach(Value in Buf) {
|
||||
Str += format("%02X", Value);
|
||||
}
|
||||
|
||||
save_equiment_socket(Str, id);
|
||||
// if (!save_equiment_socket(DB_JewelSocketData, id)) {
|
||||
// print("写入失败了");
|
||||
// return null;
|
||||
// }
|
||||
|
||||
CUser_SendUpdateItemList_DB(SUser, equipment_inven_slot, JewelSocketData); //用于更新镶嵌后的装备显示,这里用的是带镶嵌数据的更新背包函数,并非CUser_SendUpdateItemList
|
||||
local Pack = Packet();
|
||||
Pack.Put_Header(1, 209);
|
||||
Pack.Put_Byte(1);
|
||||
Pack.Put_Short(equipment_inven_slot + 104);
|
||||
Pack.Finalize(true);
|
||||
SUser.Send(Pack);
|
||||
Pack.Delete();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
AvatarLogic(args, PackIndex);
|
||||
|
||||
return null;
|
||||
}.bindenv(this);
|
||||
|
||||
Cb_Dispatcher_UseJewel_Leave_Func.EquimentUseJewel <- function(args) {
|
||||
return -1;
|
||||
}.bindenv(this);
|
||||
|
||||
//额外数据包,发送装备镶嵌数据给本地处理
|
||||
Cb_InterfacePacketBuf_put_packet_Leave_Func.EquimentUseJewel <- function(args) {
|
||||
local ret = args.pop();
|
||||
local Inven_Item = NativePointer(args[1]);
|
||||
if (Inven_Item.add(1).readU8() == 1) {
|
||||
local ItemObj = Item(args[1]);
|
||||
local JewelSocketData = api_get_jewel_socket_data(NativePointer(ItemObj.C_Object).add(25).readU32());
|
||||
if (JewelSocketData && JewelSocketData.add(0).readU8() != 0) {
|
||||
local Pack = Packet(args[0]);
|
||||
Pack.Put_BinaryEx(JewelSocketData.C_Object, 30);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}.bindenv(this);
|
||||
|
||||
L_HookEquimentUseJewel();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
function WongWork_CAvatarItemMgr_getJewelSocketData(a, b) {
|
||||
return Sq_CallFunc(S_Ptr("0x82F98F8"), "pointer", ["pointer", "int"], a, b);
|
||||
}
|
||||
|
||||
function CStackableItem_getJewelTargetSocket(C_Object) {
|
||||
return Sq_CallFunc(S_Ptr("0x0822CA28"), "int", ["pointer"], C_Object);
|
||||
}
|
||||
|
||||
function CInventory_delete_item(C_Object, Type, Slot, Count, Ps, Log) {
|
||||
return Sq_CallFunc(S_Ptr("0x850400C"), "int", ["pointer", "int", "int", "int", "int", "int"], C_Object, Type, Slot, Count, Ps, Log);
|
||||
}
|
||||
|
||||
function api_set_JewelSocketData(jewelSocketData, slot, emblem_item_id) {
|
||||
if (jewelSocketData) {
|
||||
NativePointer(jewelSocketData).add(slot * 6 + 2).writeInt(emblem_item_id);
|
||||
}
|
||||
}
|
||||
|
||||
function DB_UpdateAvatarJewelSlot_makeRequest(a, b, c) {
|
||||
return Sq_CallFunc(S_Ptr("0x843081C"), "pointer", ["int", "int", "pointer"], a, b, c);
|
||||
}
|
||||
|
||||
//获取时装在数据库中的uid
|
||||
function api_get_avartar_ui_id(avartar) {
|
||||
return NativePointer(avartar).add(7).readInt();
|
||||
}
|
||||
|
||||
|
||||
function AvatarLogic(args, PackIndex) {
|
||||
//角色
|
||||
local SUser = User(args[1]);
|
||||
//包数据
|
||||
local Pack = Packet(args[2]);
|
||||
//还原包读取数据号位
|
||||
NativePointer(args[2]).add(4).writeInt(PackIndex);
|
||||
|
||||
//校验角色状态是否允许镶嵌
|
||||
if (!SUser || SUser.GetState() != 3) {
|
||||
return;
|
||||
}
|
||||
//时装所在的背包槽
|
||||
local Inven_Slot = Pack.GetShort();
|
||||
//时装item_id
|
||||
local Item_Id = Pack.GetInt();
|
||||
//本次镶嵌徽章数量
|
||||
local Emblem_Count = Pack.GetByte();
|
||||
|
||||
//获取时装道具
|
||||
local InvemObj = SUser.GetInven();
|
||||
local AvatarObj = InvemObj.GetSlot(2, Inven_Slot);
|
||||
|
||||
|
||||
//校验时装 数据是否合法
|
||||
if (!AvatarObj || AvatarObj.IsEmpty || (AvatarObj.GetIndex() != Item_Id) || SUser.CheckItemLock(2, Inven_Slot)) return;
|
||||
|
||||
local Avartar_AddInfo = AvatarObj.GetAdd_Info();
|
||||
//获取时装管理器
|
||||
local Inven_AvartarMgr = InvemObj.GetAvatarItemMgr();
|
||||
|
||||
//获取时装插槽数据
|
||||
local Jewel_Socket_Data = WongWork_CAvatarItemMgr_getJewelSocketData(Inven_AvartarMgr, Avartar_AddInfo);
|
||||
if (!Jewel_Socket_Data) return;
|
||||
|
||||
//最多只支持3个插槽
|
||||
if (Emblem_Count <= 3) {
|
||||
local emblems = {};
|
||||
|
||||
for (local i = 0; i< Emblem_Count; i++) {
|
||||
//徽章所在的背包槽
|
||||
local emblem_inven_slot = Pack.GetShort();
|
||||
//徽章item_id
|
||||
local emblem_item_id = Pack.GetInt();
|
||||
//该徽章镶嵌的时装插槽id
|
||||
local avartar_socket_slot = Pack.GetByte();
|
||||
|
||||
//获取徽章道具
|
||||
local EmblemObje = InvemObj.GetSlot(1, emblem_inven_slot);
|
||||
|
||||
//校验徽章及插槽数据是否合法
|
||||
if (!EmblemObje || EmblemObje.IsEmpty || (EmblemObje.GetIndex() != emblem_item_id) || (avartar_socket_slot >= 3)) return;
|
||||
|
||||
//校验徽章是否满足时装插槽颜色要求
|
||||
//获取徽章pvf数据
|
||||
local citem = PvfItem.GetPvfItemById(emblem_item_id);
|
||||
if (!citem) return;
|
||||
|
||||
//校验徽章类型
|
||||
if (!citem.IsStackable() || citem.GetItemType() != 20) return;
|
||||
|
||||
//获取徽章支持的插槽
|
||||
local emblem_socket_type = CStackableItem_getJewelTargetSocket(citem.C_Object);
|
||||
|
||||
//获取要镶嵌的时装插槽类型
|
||||
local avartar_socket_type = NativePointer(Jewel_Socket_Data).add(avartar_socket_slot * 6).readShort();
|
||||
|
||||
if (!(emblem_socket_type & avartar_socket_type)) return;
|
||||
|
||||
emblems[avartar_socket_slot] <- [emblem_inven_slot, emblem_item_id];
|
||||
}
|
||||
|
||||
//开始镶嵌
|
||||
foreach(avartar_socket_slot, emblemObject in emblems) {
|
||||
//删除徽章
|
||||
local emblem_inven_slot = emblemObject[0];
|
||||
CInventory_delete_item(InvemObj.C_Object, 1, emblem_inven_slot, 1, 8, 1);
|
||||
//设置时装插槽数据
|
||||
local emblem_item_id = emblemObject[1];
|
||||
api_set_JewelSocketData(Jewel_Socket_Data, avartar_socket_slot, emblem_item_id);
|
||||
}
|
||||
|
||||
//时装插槽数据存档
|
||||
DB_UpdateAvatarJewelSlot_makeRequest(SUser.GetCID(), api_get_avartar_ui_id(AvatarObj.C_Object), Jewel_Socket_Data);
|
||||
|
||||
//通知客户端时装数据已更新
|
||||
SUser.SendUpdateItemList(1, 1, Inven_Slot);
|
||||
|
||||
//回包给客户端
|
||||
local Pack = Packet();
|
||||
Pack.Put_Header(1, 204);
|
||||
Pack.Put_Int(1);
|
||||
Pack.Finalize(true);
|
||||
SUser.Send(Pack);
|
||||
Pack.Delete();
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
constructor() {
|
||||
CreateMysqlTable();
|
||||
|
||||
FixFunction();
|
||||
}
|
||||
}
|
||||
|
||||
function _Dps_Equ2AvaJewel_Main_() {
|
||||
local Config = GlobalConfig.Get("装备镶嵌与时装镶嵌_Lenheart.json");
|
||||
local PoolObj = MysqlPool.GetInstance();
|
||||
local Ip = Config["数据库IP 不是外置数据库不要更改"];
|
||||
local Port = Config["数据库端口 不懂不要更改"];
|
||||
local DbName = Config["数据库用户名 本地用户名不懂不要更改"];
|
||||
local Password = Config["数据库密码 本地密码不懂不要更改"];
|
||||
//设置数据库连接信息
|
||||
PoolObj.SetBaseConfiguration(Ip, Port, DbName, Password);
|
||||
//连接池大小
|
||||
PoolObj.PoolSize = 10;
|
||||
//初始化
|
||||
PoolObj.Init();
|
||||
//装备镶嵌修复
|
||||
getroottable()._EquimentUseJewel_Object <- EquimentUseJewel();
|
||||
}
|
||||
11
OfficialProject/设置装备解锁时间/Proj.ifo
Normal file
11
OfficialProject/设置装备解锁时间/Proj.ifo
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"ProjectName": "设置装备解锁时间",
|
||||
"ProjectDescribe": "是指装备解锁需要等待的冷却时间。",
|
||||
"ProjectAuthor": "倾泪寒",
|
||||
"ProjectVersion": 1.0,
|
||||
"ProjectConfig": "设置装备解锁时间_Lenheart.json",
|
||||
"ProjectFiles": [
|
||||
"设置装备解锁时间.nut"
|
||||
],
|
||||
"ProjectRunFunc": "_Dps_SetEquipmentUnlockTime_Main_"
|
||||
}
|
||||
5
OfficialProject/设置装备解锁时间/设置装备解锁时间.nut
Normal file
5
OfficialProject/设置装备解锁时间/设置装备解锁时间.nut
Normal file
@@ -0,0 +1,5 @@
|
||||
function _Dps_SetEquipmentUnlockTime_Main_()
|
||||
{
|
||||
local Config = GlobalConfig.Get("设置装备解锁时间_Lenheart.json");
|
||||
GameManager.SetItemLockTime(Config["设置装备解锁需要的冷却时间_单位秒"]);
|
||||
}
|
||||
11
OfficialProject/跨界石/Proj.ifo
Normal file
11
OfficialProject/跨界石/Proj.ifo
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"ProjectName": "跨界石",
|
||||
"ProjectDescribe": "通过指定ID的道具,将装备背包第一格的装备跨界。\n配置中修改NoCrossIdArr可增加不可跨界的ID。",
|
||||
"ProjectAuthor": "倾泪寒",
|
||||
"ProjectVersion": 1.2,
|
||||
"ProjectConfig": "跨界石_Lenheart.json",
|
||||
"ProjectFiles": [
|
||||
"跨界石.nut"
|
||||
],
|
||||
"ProjectRunFunc": "_Dps_CrossBorderStones_Main_"
|
||||
}
|
||||
57
OfficialProject/跨界石/跨界石.nut
Normal file
57
OfficialProject/跨界石/跨界石.nut
Normal file
@@ -0,0 +1,57 @@
|
||||
function _Dps_CrossBorderStones_Main_() {
|
||||
local Cofig = GlobalConfig.Get("跨界石_Lenheart.json");
|
||||
Cb_Use_Item_Sp_Func[Cofig.CrossoverId.tointeger()] <- function(SUser, ItemId) {
|
||||
//获取账号金库对象
|
||||
local CargoObj = SUser.GetAccountCargo();
|
||||
//获取账号金库中的一个空格子
|
||||
local EmptySlot = CargoObj.GetEmptySlot();
|
||||
|
||||
//如果没有空格子
|
||||
if (EmptySlot == -1) {
|
||||
SUser.SendNotiPacketMessage(Cofig.CrossoverStr2, 8);
|
||||
//不扣除道具
|
||||
SUser.GiveItem(ItemId, 1);
|
||||
return;
|
||||
}
|
||||
|
||||
//获取角色背包
|
||||
local InvenObj = SUser.GetInven();
|
||||
//获取需要转移的装备 这里默认写的装备栏第一个格子
|
||||
local ItemObj = InvenObj.GetSlot(Inven.INVENTORY_TYPE_ITEM, 9);
|
||||
//获取装备ID
|
||||
local EquipId = ItemObj.GetIndex();
|
||||
//获取装备名字
|
||||
local ItemName = PvfItem.GetNameById(EquipId);
|
||||
//获取配置中不可跨界的ID数组
|
||||
local NoCrossId = Cofig.NoCrossIdArr;
|
||||
//如果这个装备不可跨界
|
||||
if (NoCrossId.find(EquipId) != null) {
|
||||
SUser.SendNotiPacketMessage(format(Cofig.CrossoverStr5, ItemName), 7);
|
||||
//不扣除道具
|
||||
SUser.GiveItem(ItemId, 1);
|
||||
return;
|
||||
}
|
||||
//如果没找到这个格子的装备
|
||||
if (!ItemName) {
|
||||
SUser.SendNotiPacketMessage(Cofig.CrossoverStr1, 8);
|
||||
//不扣除道具
|
||||
SUser.GiveItem(ItemId, 1);
|
||||
return;
|
||||
}
|
||||
//跨界
|
||||
local Flag = CargoObj.InsertItem(ItemObj, EmptySlot);
|
||||
if (Flag == -1) {
|
||||
SUser.SendNotiPacketMessage(Cofig.CrossoverStr3, 8);
|
||||
//不扣除道具
|
||||
SUser.GiveItem(ItemId, 1);
|
||||
} else {
|
||||
//销毁背包中的道具
|
||||
ItemObj.Delete();
|
||||
//刷新玩家背包列表
|
||||
SUser.SendUpdateItemList(1, 0, 9);
|
||||
//刷新账号金库列表
|
||||
CargoObj.SendItemList();
|
||||
SUser.SendNotiPacketMessage(format(Cofig.CrossoverStr4, ItemName), 7);
|
||||
}
|
||||
}
|
||||
}
|
||||
11
OfficialProject/防脱机制裁/Proj.ifo
Normal file
11
OfficialProject/防脱机制裁/Proj.ifo
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"ProjectName": "防脱机制裁",
|
||||
"ProjectDescribe": "本项目只能够防止脱机外挂,配置可以更改",
|
||||
"ProjectAuthor": "南瓜",
|
||||
"ProjectVersion": 1.3,
|
||||
"ProjectConfig": "防脱机制裁_Nangua.json",
|
||||
"ProjectFiles": [
|
||||
"防脱机制裁.sut"
|
||||
],
|
||||
"ProjectRunFunc": "_Dps_AntiOfflineSanctions_Main_"
|
||||
}
|
||||
BIN
OfficialProject/防脱机制裁/防脱机制裁.sut
Normal file
BIN
OfficialProject/防脱机制裁/防脱机制裁.sut
Normal file
Binary file not shown.
Reference in New Issue
Block a user