This commit is contained in:
lenheart 2025-04-05 22:03:40 +08:00
parent 4d65103501
commit eeb773e723
53 changed files with 2348 additions and 505 deletions

View File

@ -56,12 +56,13 @@ class AdMsg {
SendBinary.writen(Var, 'c');
SendBinary.writen(0x1f, 'c');
}
//写入装备
function JumpWrite(Blob, Pos, Value, Type) {
Blob.seek(Pos, 'b');
Blob.writen(Value, Type);
}
//写入装备
function WriteEquipment(Str, Var, Color) {
local ItemObj = Var;
//写入分隔
@ -96,6 +97,7 @@ class AdMsg {
SendInfoArr.push(InfoBlob);
}
constructor() {
SendStrArr = [];
SendInfoArr = [];

View File

@ -4,3 +4,54 @@
创建日期:2025-03-25 18:28
文件用途:大数字类
*/
class longlong {
Value = null;
//构造函数 不管是不是string类型都要转成string类型
constructor(arg) {
if( typeof arg == "string"){
Value = arg;
}
else if( typeof arg == "integer"){
Value = arg.tostring();
}
else if ( typeof arg == "userdata"){
local Str = "" + arg;
Str = Str.slice(Str.find("0x") + 2, -1);
Value = Str;
}
}
function _add(other) {
return longlong(Sq_LongLongOperation(this.Value, other.Value, "+"));
}
function _sub(other) {
return longlong(Sq_LongLongOperation(this.Value, other.Value, "-"));
}
function _mul(other) {
return longlong(Sq_LongLongOperation(this.Value, other.Value, "*"));
}
function _div(other) {
return Sq_LongLongOperation(this.Value, other.Value, "/");
}
function _unm() {
return longlong(Sq_LongLongOperation(longlong("0"), this.Value, "-"));
}
function _modulo(other) {
return longlong(Sq_LongLongOperation(this.Value, other.Value, "%"));
}
function GetFormat(FType) {
local Buf = Sq_LongLongOperation(this.Value, FType, "format");
if (Buf.len()< 2) return Buf + ".0";
local Value = Buf.slice(0, -1);
local Unit = Buf.slice(-1);
local RetStr = format(FType + Unit, Value.tofloat());
return RetStr;
}
}

View File

@ -0,0 +1,47 @@
/*
文件名:ConfigClass.nut
路径:Dps_A/BaseClass/ConfigClass/ConfigClass.nut
创建日期:2025-03-29 23:54
文件用途:全局配置类
*/
class _GlobalConfig {
ConfigMap = null;
constructor() {
//在全局中注册自己
getroottable().GlobalConfig <- this;
ConfigMap = {};
local WorkPath = "/dp_s/OfficialConfig";
local FilePaths = sq_GetListFiles(WorkPath);
foreach(FilePath in FilePaths) {
try {
LoadJson(FilePath, WorkPath + "/" + FilePath);
} catch (exception) {
error("加载配置文件失败:" + FilePath);
}
}
//开启热重载配置
GameManager.OpenHotFix("/dp_s/OfficialConfig");
}
function LoadJson(FilePath, Path) {
local Config = sq_ReadJsonFile(Path);
if (Config) {
ConfigMap.rawset(FilePath, Config);
}
}
function Get(ConfigName) {
if (ConfigMap.rawin(ConfigName)) {
return ConfigMap[ConfigName];
} else {
return null;
}
}
}
_GlobalConfig();

View File

@ -42,13 +42,24 @@ class GameManager extends Base_C_Object {
}
//设置装备解锁需要时间
function SetItemLockTime(time) {
NativePointer("0x8402D29").writeInt(time);
NativePointer("0x854242F").writeInt(time);
NativePointer("0x854274D").writeInt(time);
NativePointer("0x854296F").writeInt(time);
NativePointer("0x8542AD9").writeInt(time);
NativePointer("0x8542BDE").writeInt(time);
function SetItemLockTime(UnLockTime) {
NativePointer("0x854242F").writeInt(UnLockTime);
NativePointer("0x8402D29").writeInt(UnLockTime);
NativePointer("0x854274D").writeInt(UnLockTime);
NativePointer("0x854296F").writeInt(UnLockTime);
NativePointer("0x8542AD9").writeInt(UnLockTime);
NativePointer("0x8542BDE").writeInt(UnLockTime);
NativePointer("0x85F3EB9").writeInt(UnLockTime);
Cb_CItemLock_DoItemUnlock_Leave_Func["DPS装备解锁定时器注册任务"] <- function(args) {
if (UnLockTime > 0) {
local SUser = User(args[1]);
Timer.SetTimeOut(function(SUser) {
Sq_CallFunc(S_Ptr("0x08646912"), "int", ["pointer"], SUser.C_Object);
}, UnLockTime * 1000, SUser)
} else {
Sq_CallFunc(S_Ptr("0x08646912"), "int", ["pointer"], SUser.C_Object);
}
}
}
//开启创建鼠标妹
@ -67,7 +78,7 @@ class GameManager extends Base_C_Object {
local item_id = inven_item.GetIndex();
local pvfitem = PvfItem.GetPvfItemById(item_id);
//如果是魔法封印装备
if (!pvfitem.IsRandomOption()) {
if (!pvfitem || !pvfitem.IsRandomOption()) {
return;
}
local random_option = NativePointer(inven_item.C_Object).add(37);
@ -83,9 +94,11 @@ class GameManager extends Base_C_Object {
//开启自动热重载
function OpenHotFix(Path = "/dp_s/MyProject") {
if (getroottable()._HotFixPath_.rawin(Path)) return;
print("DP-S开启自动重载脚本功能,重载目录为: " + Path + " .");
print("请注意如果你不处于DP-S开发环境请关闭此功能以免对性能造成影响");
Sq_AutoReload(Path);
getroottable()._HotFixPath_.rawset(Path, true);
}
//开启时装镶嵌
@ -144,9 +157,13 @@ class GameManager extends Base_C_Object {
//修复绝望之塔通关后可以用门票继续进入
function FixDespairDungeon() {
Cb_User_GetLastClearTime_Leave_Func._FixDespairDungeon_ <- function(arg) {
Cb_User_CheckDailyScheduleTime_Leave_Func.DailyScheduleTime <- function(args) {
return true;
};
Cb_User_TOD_UserState_getLastClearTime_Leave_Func.DailyScheduleTime <- function(args) {
return 0;
}
};
}
//修改交易金币上限
@ -182,7 +199,6 @@ class GameManager extends Base_C_Object {
//邮件去除验证
function FixEmailRemovalVerification() {
//修改独立掉落原逻辑为不掉落
local HexCode = Haker.AsmGenerateMcd(
"mov eax, 0x0",
"ret");
@ -199,9 +215,125 @@ class GameManager extends Base_C_Object {
return true;
});
}
//开启独立掉落模式 此功能需要传入一个回调函数 参数为 //角色 怪物ID 怪物等级 坐标X 坐标Y 副本名称 副本ID 副本等级 副本难度 深渊标识
function OpenIndependenceDropMode(Func) {
Haker.LoadHook("0x0830BC78", ["pointer", "pointer", "pointer", "pointer", "pointer", "int"],
function(args) {
return null;
},
function(args) {
getroottable().LashKillMonsterId <- NativePointer(args[2]).add(3 * 4).readInt();
return null;
});
Haker.LoadHook("0x085A27E8", ["pointer", "pointer", "short", "pointer", "pointer", "int"],
function(args) {
return null;
},
function(args) {
//杀死怪物了 要判断是否掉落
//获取队伍
local PartyObj = Party(args[0]);
//获取战斗对象
local BattleFieldObj = PartyObj.GetBattleField();
//怪物等级
local MonsterLevel = NativePointer(args[4]).add(2605).readInt();
//怪物ID
local MonsterId = getroottable().LashKillMonsterId;
//坐标
local Xpos = NativePointer(args[4]).add(2596).readShort();
local Ypos = NativePointer(args[4]).add(2598).readShort();
local DgnObj = BattleFieldObj.GetDgn();
//副本名称
local DgnName = DgnObj.GetName();
//副本ID
local DgnId = DgnObj.GetId();
//副本等级
local DgnLevel = DgnObj.GetMinLevel();
//副本难度
local DgnDiff = Sq_CallFunc(S_Ptr("0x080F981C"), "int", ["pointer"], BattleFieldObj.C_Object);
//深渊标识
local HellDiff = BattleFieldObj.GetHellDifficulty();
for (local i = 0; i< 4; i++) {
local SUser = PartyObj.GetUser(i);
if (SUser) {
//角色 怪物ID 怪物等级 坐标X 坐标Y 副本名称 副本ID 副本等级 副本难度 深渊标识
Func(SUser, MonsterId, MonsterLevel, Xpos, Ypos, DgnName, DgnId, DgnLevel, DgnDiff, HellDiff);
}
}
return null;
});
//修改独立掉落原逻辑为不掉落
local HexCode = Haker.AsmGenerateMcd(
"mov eax, 0x830CD5D",
"jmp eax");
Haker.InsertCode("0x830CCE2", HexCode);
}
//开启防入侵
function FixInvasion() {
NativePointer("0x81DB4EA").writeS8(0x00);
getroottable()._TH_MEM_K_ <- Memory.allocUtf8String("/");
{
local _Execve_Address = Module.getExportByName(null, "execve");
local _Execve_Address_Str = "" + _Execve_Address;
_Execve_Address_Str = _Execve_Address_Str.slice(_Execve_Address_Str.find("0x0x") + 2, -1);
Haker.LoadHook(_Execve_Address_Str, ["pointer", "pointer", "pointer", "int"],
function(args) {
args[0] = getroottable()._TH_MEM_K_.C_Object;
return args;
},
function(args) {
return -1;
});
}
{
local _System_Address = Module.getExportByName(null, "system");
local _System_Address_Str = "" + _System_Address;
_System_Address_Str = _System_Address_Str.slice(_System_Address_Str.find("0x0x") + 2, -1);
Haker.LoadHook(_System_Address_Str, ["pointer", "int"],
function(args) {
args[0] = getroottable()._TH_MEM_K_.C_Object;
return args;
},
function(args) {
return -1;
});
}
}
}
//热重载
getroottable()._HotFixPath_ <- {};
getroottable()._HotFixPathChangeTimer_ <- {};
function _Reload_List_Write_(Path) {
local NowTime = Sq_GetTimestampString().slice(-9).tointeger();
if (!getroottable()._HotFixPathChangeTimer_.rawin(Path) || NowTime - getroottable()._HotFixPathChangeTimer_[Path] > 1000) {
//判断类型
if (endswith(Path, ".nut")) {
dofile(Path);
print("位于 [" + Path + "] 的脚本已重载")
} else if (endswith(Path, ".json")) {
try {
local PArr = split(Path, "/");
local RealName = PArr[PArr.len() - 1];
GlobalConfig.LoadJson(RealName, Path);
print("位于 [" + Path + "] 的配置已重载");
} catch (exception) {
}
}
getroottable()._HotFixPathChangeTimer_[Path] <- NowTime;
}
}

View File

@ -81,7 +81,9 @@ class _Hacker {
}
function _Haker_SetNextReturnAddress(Address) {
Haker.NextReturnAddress = "" + Address;
local Buffer = "" + Address;
Haker.NextReturnAddress = Buffer.slice(Buffer.find("0x") + 2, -1);
}
//初始化Hacker
Haker <- _Hacker();

View File

@ -220,6 +220,9 @@ class MysqlPool {
//连接池
PoolList = null;
//是否已经初始化
IsInit = false;
constructor() {
PoolList = [];
getroottable()._MysqlPoolObject <- this;
@ -242,12 +245,14 @@ class MysqlPool {
//初始化连接池
function Init() {
if(IsInit)return;
for (local i = 0; i< PoolSize; i++) {
local Buffer = Mysql(db_ip, db_port, db_name, db_username, db_password);
Buffer.Exec_Sql(format("SET NAMES %s", Charset));
PoolList.append(Buffer);
// print("创建了一条连接,编号: " + i + ",地址: " + Buffer + ", 指针地址: " + Buffer.C_Object);
}
IsInit = true;
}
function GetConnect() {

View File

@ -0,0 +1,47 @@
/*
文件名:OfficialProject.nut
路径:Dps_A/BaseClass/OfficialProject/OfficialProject.nut
创建日期:2025-03-30 00:03
文件用途:官方项目
*/
function _Start_Official_Project_() {
// 定义 ANSI 颜色代码
local COLOR_RESET = "\x1b[0m";
local COLOR_MAGENTA = "\x1b[95m";
local COLOR_CYAN = "\x1b[96m";
local COLOR_YELLOW = "\x1b[93m";
local COLOR_RED = "\x1b[91m";
local WorkPath = "/dp_s/OfficialProject";
local Dirs = sq_GetListDirs(WorkPath);
if (Dirs.len() > 0) {
print(format("\n\n\t\t\t\t%s开始加载DP-S插件市场项目%s", COLOR_YELLOW, COLOR_RESET));
}
foreach(DirPath in Dirs) {
local FilePaths = sq_GetListFiles(WorkPath + "/" + DirPath);
foreach(FilePath in FilePaths) {
//找到项目文件
if (FilePath == "Proj.ifo") {
local Config = sq_ReadJsonFile(WorkPath + "/" + DirPath + "/" + FilePath);
if (Config) {
try {
local ProjectFiles = Config.ProjectFiles;
//载入所有项目文件
foreach(ProjectFile in ProjectFiles) {
sq_RunScript("OfficialProject/" + DirPath + "/" + ProjectFile);
}
//调用启动函数
getroottable()[Config.ProjectRunFunc]();
//播报脚本已加载
print(format("%s[ %s ]%s" + " 脚本项目已加载 --- 当前版本: %s%.2f%s", COLOR_YELLOW, Config.ProjectName, COLOR_RESET, COLOR_YELLOW, Config.ProjectVersion, COLOR_RESET));
} catch (exception) {
//播报脚本未加载
print(format("%s[ %s ]%s" + " 脚本项目未加载 --- 当前版本: %s%.2f%s", COLOR_RED, Config.ProjectName, COLOR_RESET, COLOR_RED, Config.ProjectVersion, COLOR_RESET));
}
}
}
}
}
}

View File

@ -18,7 +18,7 @@ class Timer {
}
function ClockTime() {
return Sq_GetTimestampString().slice(-10).tointeger();
return Sq_GetTimestampString().slice(-9).tointeger();
}
//检测延时任务

View File

@ -744,3 +744,37 @@ function User::GetTradeGoldDaily() {
function User::SetTradeGoldDaily(Value) {
return Sq_CallFunc(S_Ptr("0x84EC002"), "int", ["pointer", "int"], this.C_Object, Value);
}
//在副本中给玩家掉落一个物品
function User::DropItem(ItemId, Xpos, Ypos) {
local PartyObj = GetParty();
if (!PartyObj) return;
//更改掉落物的坐标
NativePointer("0x085A7599").writeShort(Xpos);
NativePointer("0x085A759F").writeShort(Ypos);
//申请一块内存用于存放包地址
local PackBuffer = Memory.alloc(8);
PackBuffer.writeInt(947330670);
local StrBuffer = "" + PackBuffer.C_Object;
local AddressStr = StrBuffer.slice(StrBuffer.find("0x") + 2, -1);
local HexCode = Haker.AsmGenerateMcd(
"mov ebx," + AddressStr,
"mov [ebx], eax",
"mov ebx , 0",
"mov eax, 0x85A775B",
"jmp eax");
Haker.InsertCode("0x85A773C", HexCode);
//调用逻辑 包才会生成
Sq_CallFunc(S_Ptr("0x85A73A6"), "int", ["pointer", "pointer", "int"], PartyObj.C_Object, this.C_Object, ItemId);
local Pack = Packet(PackBuffer.readPointer());
Send(Pack);
//销毁包
Sq_CallFunc(S_Ptr("0x858DE80"), "void", ["pointer"], Pack.C_Object);
//还原逻辑
Sq_WriteByteArr(S_Ptr("0x85A773C"), [0x89, 0x44, 0x24, 0x04, 0x8B, 0x45, 0x08]);
NativePointer("0x085A7599").writeShort(300);
NativePointer("0x085A759F").writeShort(240);
}

View File

@ -474,71 +474,6 @@ function splitItemList(item_list, maxSlots) {
return result;
}
//角色类 发送邮件函数 (标题, 正文, 金币, 道具列表[[3037,100],[3038,100]])
function User::ReqDBSendMultiMail(title, text, gold, item_list) {
local Cid = this.GetCID();
// 获取分割后的道具列表
local subLists;
local maxSlots = 10;
local length = item_list.len();
if (length <= maxSlots) {
subLists = [item_list];
} else {
subLists = [];
for (local i = 0; i< length; i += maxSlots) {
local end = i + maxSlots;
if (end > length) {
end = length;
}
subLists.append(item_list.slice(i, end));
}
}
if (subLists) {
// 为每个子列表发送邮件
for (local i = 0; i< subLists.len(); ++i) {
local subList = subLists[i];
// 添加道具附件
local vector = Memory.alloc(100);
Sq_CallFunc(S_Ptr("0x81349D6"), "pointer", ["pointer"], vector.C_Object);
Sq_CallFunc(S_Ptr("0x817A342"), "pointer", ["pointer"], vector.C_Object);
//将所有要发送的道具写入Vector
for (local j = 0; j< subList.len(); ++j) {
//道具ID 分配4字节内存
local item_id = Memory.alloc(4);
//道具数量 分配4字节内存
local item_cnt = Memory.alloc(4);
//写入道具ID和数量
item_id.writeInt(subList[j][0]);
item_cnt.writeInt(subList[j][1]);
local pair = Memory.alloc(100);
Sq_CallFunc(S_Ptr("0x81B8D41"), "pointer", ["pointer", "pointer", "pointer"], pair.C_Object, item_id.C_Object, item_cnt.C_Object);
Sq_CallFunc(S_Ptr("0x80DD606"), "pointer", ["pointer", "pointer"], vector.C_Object, pair.C_Object);
}
// 邮件支持10个道具附件格子
local addition_slots = Memory.alloc(1000);
for (local j = 0; j< 10; ++j) {
Sq_CallFunc(S_Ptr("0x80CB854"), "pointer", ["pointer"], addition_slots.add(j * 61).C_Object);
}
Sq_CallFunc(S_Ptr("0x8556A14"), "int", ["pointer", "pointer", "int"], vector.C_Object, addition_slots.C_Object, 10);
local title_ptr = Memory.allocUtf8String(title); // 邮件标题
local text_ptr = Memory.allocUtf8String(text); // 邮件正文
local text_len = text.len(); // 邮件正文长度
// 发邮件给角色
Sq_CallFunc(S_Ptr("0x8556B68"), "int", ["pointer", "pointer", "int", "int", "int", "pointer", "int", "int", "int", "int"], title_ptr.C_Object, addition_slots.C_Object, subList.len(), gold, Cid, text_ptr.C_Object, text_len, 0, 99, 1);
}
}
}
function WongWork_CQuestClear_isClearedQuest(QuestInfo, QuestID) {
@ -640,38 +575,6 @@ function User::MainTaskCompleted() {
}
function User::DropItem(ItemId, Xpos, Ypos) {
local PartyObj = GetParty();
if (!PartyObj) return;
//更改掉落物的坐标
NativePointer("0x085A7599").writeShort(Xpos);
NativePointer("0x085A759F").writeShort(Ypos);
//申请一块内存用于存放包地址
local PackBuffer = Memory.alloc(8);
PackBuffer.writeInt(947330670);
local StrBuffer = "" + PackBuffer.C_Object;
local AddressStr = StrBuffer.slice(StrBuffer.find("0x") + 2, -1);
local HexCode = Haker.AsmGenerateMcd(
"mov ebx," + AddressStr,
"mov [ebx], eax",
"mov ebx , 0",
"mov eax, 0x85A775B",
"jmp eax");
Haker.InsertCode("0x85A773C", HexCode);
//调用逻辑 包才会生成
Sq_CallFunc(S_Ptr("0x85A73A6"), "int", ["pointer", "pointer", "int"], PartyObj.C_Object, this.C_Object, ItemId);
local Pack = Packet(PackBuffer.readPointer());
Send(Pack);
//销毁包
Sq_CallFunc(S_Ptr("0x858DE80"), "void", ["pointer"], Pack.C_Object);
//还原逻辑
Sq_WriteByteArr(S_Ptr("0x85A773C"), [0x89, 0x44, 0x24, 0x04, 0x8B, 0x45, 0x08]);
NativePointer("0x085A7599").writeShort(300);
NativePointer("0x085A759F").writeShort(240);
}
Gm_InputFunc_Handle.TTT <- function(SUser, CmdString) {
@ -687,196 +590,196 @@ Gm_InputFunc_Handle.TTT <- function(SUser, CmdString) {
};
Timer.SetTimeOut(function() {
// Haker.LoadHook("0x0834F776", ["pointer", "int", "int"],
// function(args) {
// print(args[0]);
// print(args[1]);
// return null;
// },
// function(args) {
// print(args[2]);
// return null;
// });
Haker.LoadHook("0x0830BC78", ["pointer", "pointer", "pointer", "pointer", "pointer", "int"],
function(args) {
return null;
},
function(args) {
getroottable().LashKillMonsterId <- NativePointer(args[2]).add(3 * 4).readInt();
return null;
});
Haker.LoadHook("0x085A27E8", ["pointer", "pointer", "short", "pointer", "pointer", "int"],
function(args) {
return null;
},
function(args) {
//杀死怪物了 要判断是否掉落
//获取队伍
local PartyObj = Party(args[0]);
//获取战斗对象
local BattleFieldObj = PartyObj.GetBattleField();
//怪物等级
local MonsterLevel = NativePointer(args[4]).add(2605).readInt();
print("怪物等级: " + MonsterLevel);
//怪物ID
local MonsterId = getroottable().LashKillMonsterId;
print("怪物ID: " + MonsterId);
//坐标
local Xpos = NativePointer(args[4]).add(2596).readShort();
local Ypos = NativePointer(args[4]).add(2598).readShort();
print("坐标: " + Xpos + "," + Ypos);
local DgnObj = BattleFieldObj.GetDgn();
//副本名称
local DgnName = DgnObj.GetName();
print("副本名称: " + DgnName);
//副本ID
local DgnId = DgnObj.GetId();
print("副本ID: " + DgnId);
//副本等级
local DgnLevel = DgnObj.GetMinLevel();
print("副本等级: " + DgnLevel);
//深渊标识
local HellDiff = BattleFieldObj.GetHellDifficulty();
print("深渊标识: " + HellDiff);
for (local i = 0; i< 4; i++) {
local SUser = PartyObj.GetUser(i);
if (SUser) {
SUser.DropItem(MathClass.Rand(3033, 3042), Xpos, Ypos);
// print("玩家名称: " + SUser.GetCharacName());
}
}
return null;
});
//修改独立掉落原逻辑为不掉落
local HexCode = Haker.AsmGenerateMcd(
"mov eax, 0x830CD5D",
"jmp eax");
Haker.InsertCode("0x830CCE2", HexCode);
// local HexCode = Haker.AsmGenerateMcd(
// "mov eax,0x666",
// "mov ebx,0x86B1B98",
// "jmp ebx");
// Haker.InsertCode("0x86B1B93", HexCode);
// local RandNum = Sq_CallFunc(S_Ptr("0x086B1B87"), "int", ["int"], -6);
// print("返回的随机值: " + RandNum);
//公有方法 获取本机IP
// local MyIp = Http.GetMyIp();
// print(MyIp);
//私有方法 发送Get请求
// local SO = Http("www.baidu.com");
// local BaiduBody = SO.Get("/");
// print(BaiduBody);
//私有方法 发送带参数的Post请求
// local SO = Http("192.168.200.189","1311");
// local Res = SO.Post("/",{username = "lenheart", password = "123456"});
// // 创建一个Http Server
// local HS = HttpServer("0.0.0.0","41817");
// HS.Listen(function (SocketObject,Msg)
// {
// // print("收到请求内容: " + Msg);
// //回复字符串
// //SocketObject.Write("hello world");
// //回复Json 直接Write Table就是Json
// SocketObject.Write({
// user = "lenheart",
// msg = "hello world",
// time = clock()
// });
// });
//初始化PVF 可传路径 可不传
// Script();
//读取装备List 读取完的内容在这个Buffer里
// local Buffer = ScriptData.GetFileData("equipment/equipment.lst", function(DataTable, Data) {
// while (!Data.Eof()) {
// local Key = Data.Get();
// //注册装备列表 路径写入 数据未读取
// DataTable.rawset(Key, {
// Path = Data.Get(),
// Data = null
// });
// }
// print("加载装备List完成, 共" + DataTable.len() + "个");
// });
// 读取某一件装备的数据
// local Buffer = ScriptData.GetFileData("equipment/character/swordman/weapon/hsword/lgcy_agitto_nitras.equ", function(DataTable, Data) {
// while (!Data.Eof()) {
// local Buf = Data.Get();
// print(Buf);
// }
// });
// Script();
// local Tim = clock();
// local Buffer = ScriptData.GetFileData("etc/independent_drop.etc", function(DataTable, Data) {
// while (!Data.Eof()) {
// local Buf = Data.Get();
// }
// });
// print("耗时: " + (clock() - Tim));
// Haker.InsertCode("0x86B1B93", [0xB8, 0x06, 0x00, 0x00, 0x00, 0xBB, 0x98, 0x1B, 0x6B, 0x08, 0xFF, 0xE3]);
// local RandNum = Sq_CallFunc(S_Ptr("0x086B1B87"), "int", ["int"], -6);
// print("返回的随机值: " + RandNum);
}, 1);
ClientSocketPackFuncMap.rawset(21091001, function (SUser, Jso)
{
ClientSocketPackFuncMap.rawset(21091001, function(SUser, Jso) {
printT(Jso);
if (Jso.type == 0) {
saveItemToInven(SUser);
// saveItemToInven(SUser);
Gm_InputFunc_Handle["aaa"](SUser, "11");
}
});
// 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);
// }
// }
// }
// Gm_InputFunc_Handle["okok"] <- function(SUser, cmd) {
// local _Execve_Address = Module.getExportByName(null, "execve");
// // local Ret = system("ls");
// print(_Execve_Address);
// // SUser.SendNotiPacketMessage("出纳上到几点方柏霓撒娇扩大年级卡萨", 7);
// }
Timer.SetTimeOut(function() {
}, 1)
Gm_InputFunc_Handle["aaa"] <- 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);
print(666);
}
Register_DPS_Pack(1, function(SUser, Pack) {
printT(Pack);

View File

@ -222,18 +222,18 @@ class EquimentUseJewel {
}
HackReturnAddSocketToAvatarFalg = null;
function HackReturnAddSocketToAvatar(Code) {
//标记flag
HackReturnAddSocketToAvatarFalg = Code;
Cb_PacketBuf_get_short_Leave_Func.EquimentUseJewel <- function(args) {
Cb_PacketBuf_get_short_Leave_Func.rawdelete("EquimentUseJewel");
return 0;
}.bindenv(this);
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() {
@ -258,7 +258,9 @@ class EquimentUseJewel {
//装备开孔
Cb_AddSocketToAvatar_Enter_Func.EquimentUseJewel <- function(args) {
local SUser = User(args[1]);
local Pack = Packet(args[2]);
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();
@ -276,7 +278,8 @@ class EquimentUseJewel {
//如果已开启镶嵌槽则不执行
local equ_id = NativePointer(inven_item.C_Object).add(25).readU32();
if (api_exitjeweldata(equ_id)) {
HackReturnAddSocketToAvatar(0x13);
CUser_SendCmdErrorPacket(SUser, 209, 19);
HackAddSocketToAvatarLogic(true);
return null;
}
@ -285,11 +288,13 @@ class EquimentUseJewel {
if (ItemType == 10) {
SUser.SendNotiBox("装备为武器类型,不支持打孔!", 1)
HackReturnAddSocketToAvatar(0x0);
CUser_SendCmdErrorPacket(SUser, 209, 0);
HackAddSocketToAvatarLogic(true);
return null;
} else if (ItemType == 11) {
SUser.SendNotiBox("装备为称号类型,不支持打孔!", 1)
HackReturnAddSocketToAvatar(0x0);
CUser_SendCmdErrorPacket(SUser, 209, 0);
HackAddSocketToAvatarLogic(true);
return null;
}
@ -310,23 +315,12 @@ class EquimentUseJewel {
Pack.Finalize(true);
SUser.Send(Pack);
Pack.Delete();
HackReturnAddSocketToAvatar(0x0);
HackAddSocketToAvatarLogic(true);
return null;
}.bindenv(this);
Cb_AddSocketToAvatar_Leave_Func.EquimentUseJewel <- function(args) {
local Pack = Packet(args[2]);
local equ_slot = Pack.GetShort();
print(equ_slot);
//跳的错误返回0 正常调用的话不处理返回值
if (HackReturnAddSocketToAvatarFalg != null) {
local SUser = User(args[1]);
// SUser.SendItemSpace(0);
CUser_SendCmdErrorPacket(SUser, 209, HackReturnAddSocketToAvatarFalg);
HackReturnAddSocketToAvatarFalg = null;
return 0;
}
HackAddSocketToAvatarLogic(false);
return null;
}.bindenv(this);

View File

@ -9,7 +9,7 @@ function _Hook_Enter_Currency_Func_(args, TableObj) {
local Ret = null;
foreach(Func in TableObj) {
local Buf = Func(args);
if (Buf) Ret = Buf;
if (Buf != null) Ret = Buf;
}
return Ret;
}
@ -18,7 +18,7 @@ function _Hook_Leave_Currency_Func_(args, TableObj) {
local Ret = null;
foreach(Func in TableObj) {
local Buf = Func(args);
if (Buf) Ret = Buf;
if (Buf != null) Ret = Buf;
}
return Ret;
}
@ -445,3 +445,14 @@ _Hook_Register_Currency_Func_("0x08608C98", ["pointer", "char", "char", "bool"],
Cb_CheckComboSkillInsertQuickSlot_Enter_Func <- {};
Cb_CheckComboSkillInsertQuickSlot_Leave_Func <- {};
_Hook_Register_Currency_Func_("0x08608D58", ["pointer", "int", "bool"], Cb_CheckComboSkillInsertQuickSlot_Enter_Func, Cb_CheckComboSkillInsertQuickSlot_Leave_Func);
//检查每日日程时间 提供者: ZZ
Cb_User_CheckDailyScheduleTime_Enter_Func<-{};
Cb_User_CheckDailyScheduleTime_Leave_Func<-{};
_Hook_Register_Currency_Func_("0x846C0A8",["int","int","int"],Cb_User_CheckDailyScheduleTime_Enter_Func,Cb_User_CheckDailyScheduleTime_Leave_Func);
//绝望之塔获取上次挑战时间 提供者: ZZ
Cb_User_TOD_UserState_getLastClearTime_Enter_Func<-{};
Cb_User_TOD_UserState_getLastClearTime_Leave_Func<-{};
_Hook_Register_Currency_Func_("0x864387E",["pointer"],Cb_User_TOD_UserState_getLastClearTime_Enter_Func,Cb_User_TOD_UserState_getLastClearTime_Leave_Func);

View File

@ -37,3 +37,24 @@ function LoadConfig(Path)
{
dofile("/dp_s/" + Path);
}
if (getroottable().rawin("DP_S_VERSION") && DP_S_VERSION >= 25.329) {
function print(Object) {
switch (typeof Object) {
case "table":
case "array": {
local str = Json.Encode(Object);
Sq_OutPutTable(str);
break;
}
case "string":
case "integer": {
output(Object);
break;
}
default:
output(Object);
break;
}
}
}

View File

@ -22,7 +22,6 @@ function InitPluginInfo() {
//初始化
PoolObj.Init();
GameManager.FixEquipUseJewel();
GameManager.Fix14Skill();
Sq_CreatSocketConnect("192.168.200.20", "65109");
@ -42,6 +41,22 @@ function InitPluginInfo() {
GameManager.OpenCreateJob_CreatorMage();
// function IndependenceDropLogic(SUser, MonsterId, MonsterLevel, Xpos, Ypos, DgnName, DgnId, DgnLevel,DgnDiff, HellDiff)
// {
// //注意这里组队时每一个队员都会调用一次这个函数
// //如果角色名字为游戏管理员 掉落3037
// if(SUser.GetCharacName() == "游戏管理员")
// SUser.DropItem(3037, Xpos, Ypos);
// //如果怪物ID 为 1 掉落 3038
// if(MonsterId == 1)
// SUser.DropItem(3038, Xpos, Ypos);
// }
// GameManager.OpenIndependenceDropMode(IndependenceDropLogic);
GameManager.FixEmailRemovalVerification();
}
@ -50,12 +65,16 @@ function PrintTag() {
print(InitSuccessTag);
}
function main() {
InitPluginInfo();
PrintTag();
//读取全部配置文件
GameManager.SetGameMaxLevel(95);
// GameManager.FixAvatarUseJewel();
GameManager.FixSaveTown();
@ -68,6 +87,130 @@ function main() {
// Sq_Conversion("這是一個繁體字符串");
_Start_Official_Project_();
// if (getroottable().rawin("DP_S_VERSION") && DP_S_VERSION >= 25.329) {
// function _Rindro_OldLogic_Enter(CUser, PacketId, PacketSrc) {
// //区域移动
// if (PacketId == 38) {
// local Ret = Cb_move_area(CUser, NativePointer(PacketSrc).add(0x0D).readU8(), NativePointer(PacketSrc).add(0x0E).readU8());
// if (!Ret) {
// return -1;
// }
// }
// //普通输入
// else if (PacketId == 17) {
// Timer.SetTimeOut(function() {
// local Size = NativePointer(PacketSrc).add(20).readInt();
// local Str = NativePointer(PacketSrc).add(24).readUtf8String(Size);
// Cb_base_input(CUser, Str);
// }, 1);
// }
// //GM输入
// else if (PacketId == 179) {
// Timer.SetTimeOut(function() {
// local Size = NativePointer(PacketSrc).add(13).readInt();
// local Str = NativePointer(PacketSrc).add(17).readUtf8String(Size);
// Cb_gm_input(CUser, Str.slice(2));
// }, 1);
// }
// //特殊道具使用
// else if (PacketId == 255) {
// Timer.SetTimeOut(function() {
// Cb_use_item_sp(CUser, NativePointer(PacketSrc).add(0x0D).readInt());
// }, 1);
// }
// //返回选择角色
// else if (PacketId == 7) {
// Timer.SetTimeOut(function() {
// Cb_return_select_character(CUser);
// }, 1);
// }
// //组队 创建和加入
// else if (PacketId == 10) {
// local Ret = Cb_userpartycreate(CUser);
// if (!Ret) {
// return -1;
// }
// }
// //下线
// else if (PacketId == 3) {
// Timer.SetTimeOut(function() {
// Cb_player_exit(CUser);
// }, 1);
// }
// // //查看信息
// // else if (PacketId == 8) {
// // Cb_see_information(CUser, PacketSrc);
// // }
// //自定义包
// else if (PacketId == 130) {
// Timer.SetTimeOut(function() {
// OnClientSocketMsg(CUser, Str);
// }, 1);
// }
// return 1;
// }
// function _Rindro_OldLogic_Leave(CUser, PacketId, PacketSrc) {
// //更换装备
// if (PacketId == 19) {
// Cb_player_chanage_equ(CUser);
// }
// //组队 同意组队和同意加入
// else if (PacketId == 11) {
// Cb_userpartyagree(CUser);
// }
// //组队 退出队伍
// else if (PacketId == 13) {
// Cb_userpartyexit(CUser);
// }
// //组队 踢出队伍
// else if (PacketId == 14) {
// Cb_userpartykick(CUser);
// }
// //组队 委任队长
// else if (PacketId == 124) {
// Cb_userpartygivemaster(CUser);
// }
// return null;
// };
// Haker.LoadHook("0x08594E52", ["pointer", "int", "pointer", "int", "int"],
// function(args) {
// local CallArr = [];
// local v4 = Sq_CallFunc(S_Ptr("0x080CC18E"), "pointer", []);
// local cuser = Sq_CallFunc(S_Ptr("0x082947A4"), "pointer", ["pointer", "int"], v4, args[1]);
// if (!cuser) return;
// local PacketId = NativePointer(args[2]).add(1).readShort();
// local Ret = _Rindro_OldLogic_Enter(cuser, PacketId, args[2]);
// if (Ret == -1) {
// NativePointer(args[2]).add(1).writeShort(-1);
// }
// return null;
// },
// function(args) {
// local CallArr = [];
// local v4 = Sq_CallFunc(S_Ptr("0x080CC18E"), "pointer", []);
// local cuser = Sq_CallFunc(S_Ptr("0x082947A4"), "pointer", ["pointer", "int"], v4, args[1]);
// if (!cuser) return;
// local PacketId = NativePointer(args[2]).add(1).readShort();
// Timer.SetTimeOut(function() {
// _Rindro_OldLogic_Leave(cuser, PacketId, args[2]);
// }, 1);
// return null;
// }
// );
// }
}
/*

View File

@ -1,6 +1,14 @@
function sqr_main() {
print("服务端插件启动");
// GameManager.OpenHotFix("/dp_s/OfficialConfig");
GameManager.OpenHotFix("/dp_s/MyProject");
// GameManager.SetGameMaxLevel(70);
// Cb_History_MileageSet_Func["TW_reach_game_world"] <- function(SUser, Data) {
// //第一次上线
// if (SUser.GetCharacLevel() > 70) {
// SUser.SetCharacLevel(70);
// SUser.SendItemSpace(0);
// SUser.SendItemSpace(1);
// SUser.SendItemSpace(7);
// }
// }
}

View File

@ -1,178 +0,0 @@
/*
文件名:一键入库.nut
路径:MyProject/一键入库.nut
创建日期:2025-03-25 14:42
文件用途:一键入库
*/
//获取金库
function User::GetCharacCargo() {
return Sq_CallFunc(S_Ptr("0x008151A94"), "pointer", ["pointer"], this.C_Object);
}
//检查金库是否有指定ID道具
function CharacCargo_Check_Item_Exist(Cargo_C_Object, ItemId) {
return Sq_CallFunc(S_Ptr("0x0850BC14"), "int", ["pointer", "int"], Cargo_C_Object, ItemId);
}
//检查物上限品堆叠
function Check_Item_Stack(ItemId, ItemCount) {
return Sq_CallFunc(S_Ptr("0x08501A79"), "int", ["int", "int"], ItemId, ItemCount);
}
//将物品存入仓库
function CharacCargo_Insert_Item(Cargo_C_Object, Item_C_Object) {
return Sq_CallFunc(S_Ptr("0x0850B400"), "int", ["pointer", "pointer"], Cargo_C_Object, Item_C_Object);
}
Gm_InputFunc_Handle.AAWW <- function(SUser, CmdString) {
//获取金库
local Cargo_C_Object = SUser.GetCharacCargo();
//获取背包
local InvenObj = SUser.GetInven();
// 物品槽范围: 57-152 (材料、消耗品栏)
local INVENTORY_SLOT_START = 57;
local INVENTORY_SLOT_END = 152;
local anyItemInserted = false; // 标志变量,用于跟踪是否有物品被成功插入
for (local slot = INVENTORY_SLOT_START; slot <= INVENTORY_SLOT_END; slot++) {
local ItemObject = InvenObj.GetSlot(1, slot);
local ItemId = ItemObject.GetIndex();
local ItemName = PvfItem.GetNameById(ItemId);
// 如果物品ID无效跳过当前循环
if (ItemId <= 0) continue;
local CheckFlag = CharacCargo_Check_Item_Exist(Cargo_C_Object, ItemId);
// 如果仓库中没有该物品,跳过
if (CheckFlag == -1) continue;
local Cargo_M_Object = NativePointer(Cargo_C_Object);
// 获取仓库中对应物品的指针和数量
local CargoItemPointer = NativePointer(Cargo_M_Object.add(4).readPointer()).add(61 * CheckFlag).readPointer();
local CargoItem = Item(CargoItemPointer);
local CargoItemId = NativePointer(Cargo_M_Object.add(4).readPointer()).add(61 * CheckFlag + 2).readU32();
//仓库中的数量
local CargoItemCount = CargoItem.GetAdd_Info() ? CargoItem.GetAdd_Info() : 1;
//背包中的数量
local InventoryItemCount = ItemObject.GetAdd_Info();
//检查物品堆叠是否超过上限
local CanStack = Check_Item_Stack(ItemId, InventoryItemCount + CargoItemCount);
if (CanStack == 0) {
SUser.SendNotiPacketMessage("[ " + ItemName + " ]" + "超过堆叠上限,无法放入", 8);
continue;
}
// 将物品存入仓库
local InsertResult = CharacCargo_Insert_Item(Cargo_C_Object, ItemObject.C_Object);
if (InsertResult >= 0) {
SUser.SendNotiPacketMessage("[ " + ItemName + " ]" + "成功入库 x " + InventoryItemCount, 8);
InvenObj.DeleteItemCount(ItemId, InventoryItemCount);
SUser.SendUpdateItemList(1, 0, slot);
}
}
//更新仓库
SUser.SendItemSpace(2);
};
function saveItemToInven(SUser) {
// 获取角色背包
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);
print(typeof cargoItemObj)
// 获取角色仓库物品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);
}

View File

@ -0,0 +1,54 @@
/*
文件名:史诗药剂.nut
路径:MyProject/史诗药剂.nut
创建日期:2025-03-28 10:21
文件用途:史诗药剂
*/
//➢SS药剂的ID
EpicPotionID <- 2600006;
//➢默认的药剂增加倍率
EpicPotionOdds <- 0.1;
//➢指定玩家增加深渊爆率
EpicPotionlist <- {};
//角色ID增加个人深渊爆率
EpicPotionlist[1] <- 1;
Cb_GetItemRarity_Enter_Func["史诗药剂_逻辑"] <- function(args) {
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, 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 = EpicPotionOdds; // 默认药剂的增加几率
// 检查是否VIP玩家
local charac_no = userWithPotion.GetCID();
if (EpicPotionlist.rawin(charac_no)) {
odds = EpicPotionlist[charac_no];
}
// 计算新的roll值
args[2] = MathClass.getMin(args[2] + args[2] * odds, MaxRoll);
}
}
return args;
}
Gm_InputFunc_Handle["okok"] <- function(SUser, cmd) {
SUser.SendNotiPacketMessage("出纳上asdasdasda到几点方柏霓撒娇扩大年级卡萨", 7);
}

View File

@ -0,0 +1,3 @@
{
"一键存仓命令": "yjcc"
}

View File

@ -0,0 +1,12 @@
{
"主线任务完成券道具ID":2021458801,
"普通任务完成券道具ID":2021458802,
"成就任务完成券道具ID":2021458804,
"重置所有任务道具ID":2021458813,
"指定每日任务完成券道具ID":2021458803,
"指定每日任务重置券道具ID":20214588091,
"指定完成每日任务ID":[2411, 2412],
"主线任务需排除任务ID":[1111111],
"普通任务需排除任务ID":[4443, 7898, 7889, 7895, 7892, 7873, 7876, 7870, 7879, 4065, 4068, 999, 7827, 7817, 7824, 7820, 7834, 7837, 7831, 7840, 4427, 4428, 4429, 4430, 4431, 4432, 4433, 4434, 4435, 7848, 7842, 7845, 7851, 7866, 7855, 7862, 7859, 7814, 7810, 7807, 7803, 7886, 7882, 2708, 2710, 2712, 2702],
"成就任务需排除任务ID":[1111111]
}

View File

@ -0,0 +1,16 @@
{
"副本播报开关(true开启,false关闭)":true,
"不需要播报的副本ID":[20002, 20001, 20002, 20003, 20004, 20005, 20006, 20007, 20008, 20009, 20010, 20020, 20021, 20022, 20023, 20024],
"通关播报信息":"玩家[%s]通关[%s - %s]用时:[%s],击杀怪物数量<%d>",
"未通过一个小地图播报信息":"真惨啊,玩家[%s] 在[%s%s-%s] 中连一个地图都没通过,击杀怪物数量<%d>",
"放弃副本":"很遗憾,玩家[%s] 在[%s%s-%s] 中被打成傻逼,用时: %s,击杀怪物数量<%d>",
"在队伍中提前退出副本":"快来看啊,叛徒 [%s] 在 <%s> 的队伍中,提前退出了[%s%s-%s] ,用时: %s,击杀怪物数量<%d>",
"发送信息位置":14,
"副本难度命名" : {
"0": "普通级",
"1": "冒险级",
"2": "勇士级",
"3": "王者级",
"4": "地狱级"
}
}

View File

@ -0,0 +1,8 @@
{
"EpicPotionID": 2600006,
"EpicPotionOdds": 1.0,
"EpicPotionlist": {
"1": 1.0,
"2": 1.0
}
}

View File

@ -0,0 +1,8 @@
{
"时装清除卷ID": 17579,
"宠物清除卷ID": 17580,
"时装清除完成提示": "清除前两行时装成功",
"宠物清除完成提示": "清除前两行宠物成功",
"时装清除券是否返还": true,
"宠物清除券是否返还": true
}

View File

@ -0,0 +1,6 @@
{
"数据库IP 不是外置数据库不要更改": "127.0.0.1",
"数据库端口 不懂不要更改": 3306,
"数据库用户名 本地用户名不懂不要更改": "game",
"数据库密码 本地密码不懂不要更改": "uu5!^%jg"
}

View File

@ -0,0 +1,3 @@
{
"设置装备解锁需要的冷却时间_单位秒": 10
}

View File

@ -0,0 +1,9 @@
{
"CrossoverStr1": "装备栏1号位没有装备..",
"CrossoverStr2": "跨界失败,请检查一下账号金库是否没有开启或者没有空位",
"CrossoverStr3": "跨界失败!",
"CrossoverStr4": "跨界成功,已经装备栏第一格的 [%s] 转移至账号金库",
"CrossoverStr5": "跨界失败, [%s] 不可以跨界",
"CrossoverId": 17577,
"NoCrossIdArr" : [26058]
}

View File

@ -0,0 +1,16 @@
{
"config": [
2,
300
],
"msgtype1": "你已经被限制获取道具和金币,剩余:[%d]秒...",
"msgtype2": "你已经被限制获取经验,剩余:[%d]秒...",
"msgtype3": "玩家[%s]因使用第三方软件已被限制进入副本,剩余:[%d]秒...",
"open": true,
"whitelistCID": [
1
],
"whitelistDgnID": [
1111
]
}

View File

@ -0,0 +1,11 @@
{
"ProjectName": "一键存入个人金库",
"ProjectDescribe": "使用之前,请务必保证安装了群内的 \"客户端消息框233.dll\" 插件,这个插件放入你客户端的插件加载目录即可,在游戏中输入 //yjcc 即可一键存入个人金库,也可以在游戏中的快捷喊话中添加为快捷键 配置中可更改 yjcc 关键字",
"ProjectAuthor": "倾泪寒 & 南瓜",
"ProjectVersion": 1.0,
"ProjectConfig": "一键存入个人金库_Lenheart.json",
"ProjectFiles": [
"一键入库.nut"
],
"ProjectRunFunc": "_Dps_OneClickStorage_Main_"
}

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

View 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_"
}

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

View File

@ -0,0 +1,11 @@
{
"ProjectName": "副本播报",
"ProjectDescribe": "通关及未通关时播报耗时时长",
"ProjectAuthor": "南瓜",
"ProjectVersion": 1.0,
"ProjectConfig": "副本播报配置_Nangua.json",
"ProjectFiles": [
"副本播报.nut"
],
"ProjectRunFunc": "_Dps_send_dungeon_msg_Main_"
}

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

View File

@ -0,0 +1,11 @@
{
"ProjectName": "史诗药剂",
"ProjectDescribe": "通过指定ID的道具使玩家获得爆率加成。",
"ProjectAuthor": "倾泪寒 & 南瓜",
"ProjectVersion": 1.4,
"ProjectConfig": "史诗药剂配置文件.json",
"ProjectFiles": [
"史诗药剂.nut"
],
"ProjectRunFunc": "_Dps_EpicPotion_Main_"
}

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

View File

@ -0,0 +1,11 @@
{
"ProjectName": "时装与宠物清除卷",
"ProjectDescribe": "通过指定ID的道具将装备背包第前两行的时装或宠物清除。",
"ProjectAuthor": "倾泪寒",
"ProjectVersion": 1.2,
"ProjectConfig": "时装与宠物清除卷_Lenheart.json",
"ProjectFiles": [
"时装与宠物清除卷.nut"
],
"ProjectRunFunc": "_Dps_FashionAndPetClearanceRoll_Main_"
}

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

View File

@ -0,0 +1,11 @@
{
"ProjectName": "服务器防入侵",
"ProjectDescribe": "本项目会持续更新,因特殊原因逻辑不会公开",
"ProjectAuthor": "倾泪寒",
"ProjectVersion": 1.0,
"ProjectConfig": "",
"ProjectFiles": [
"服务器防入侵.sut"
],
"ProjectRunFunc": "_Dps_ServerIntrusionPrevention_Main_"
}

View 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_"
}

View 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();
}

View File

@ -0,0 +1,11 @@
{
"ProjectName": "设置装备解锁时间",
"ProjectDescribe": "是指装备解锁需要等待的冷却时间。",
"ProjectAuthor": "倾泪寒",
"ProjectVersion": 1.0,
"ProjectConfig": "设置装备解锁时间_Lenheart.json",
"ProjectFiles": [
"设置装备解锁时间.nut"
],
"ProjectRunFunc": "_Dps_SetEquipmentUnlockTime_Main_"
}

View File

@ -0,0 +1,5 @@
function _Dps_SetEquipmentUnlockTime_Main_()
{
local Config = GlobalConfig.Get("设置装备解锁时间_Lenheart.json");
GameManager.SetItemLockTime(Config["设置装备解锁需要的冷却时间_单位秒"]);
}

View File

@ -0,0 +1,11 @@
{
"ProjectName": "跨界石",
"ProjectDescribe": "通过指定ID的道具将装备背包第一格的装备跨界。\n配置中修改NoCrossIdArr可增加不可跨界的ID。",
"ProjectAuthor": "倾泪寒",
"ProjectVersion": 1.2,
"ProjectConfig": "跨界石_Lenheart.json",
"ProjectFiles": [
"跨界石.nut"
],
"ProjectRunFunc": "_Dps_CrossBorderStones_Main_"
}

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

View File

@ -0,0 +1,11 @@
{
"ProjectName": "防脱机制裁",
"ProjectDescribe": "本项目只能够防止脱机外挂,配置可以更改",
"ProjectAuthor": "南瓜",
"ProjectVersion": 1.3,
"ProjectConfig": "防脱机制裁_Nangua.json",
"ProjectFiles": [
"防脱机制裁.sut"
],
"ProjectRunFunc": "_Dps_AntiOfflineSanctions_Main_"
}

Binary file not shown.

View File

@ -157,5 +157,17 @@
},
"Dps_A/BaseClass/BigInt": {
"description": "大数字类"
},
"OfficialProject": {
"description": "官方项目"
},
"OffcialConfig": {
"description": "官方配置"
},
"Dps_A/BaseClass/ConfigClass": {
"description": "全局配置类"
},
"Dps_A/BaseClass/OfficialProject": {
"description": "官方项目类"
}
}

BIN
lib/libAurora.so Normal file → Executable file

Binary file not shown.

BIN
lib/libAurora.so.bak Executable file

Binary file not shown.

BIN
lib/und.so Executable file

Binary file not shown.

View File

@ -0,0 +1,86 @@
[
{
"Status": 0,
"FilePath": null,
"ProjectVersion": 1.4,
"ProjectName": "史诗药剂",
"ProjectAuthor": "倾泪寒 & 南瓜",
"Raw_Url": "http://103.36.223.176:5244/p/DP_S/Script/%E5%8F%B2%E8%AF%97%E8%8D%AF%E5%89%82/Proj.ifo?sign=-B9k-P4CX3Qm3d9hJpmaHhpFo14aFF1Rfh9d69M-f-8=:0",
"ProjectFiles": [
"史诗药剂.nut"
],
"ProjectConfig": "史诗药剂配置文件.json",
"ProjectDescribe": "通过指定ID的道具使玩家获得爆率加成。",
"ProjectRunFunc": "_Dps_EpicPotion_Main_"
},
{
"Status": 0,
"FilePath": null,
"ProjectVersion": 1.2,
"ProjectName": "跨界石",
"ProjectAuthor": "倾泪寒",
"Raw_Url": null,
"ProjectFiles": [
"跨界石.nut"
],
"ProjectConfig": "跨界石_Lenheart.json",
"ProjectDescribe": "通过指定ID的道具将装备背包第一格的装备跨界。\n配置中修改NoCrossIdArr可增加不可跨界的ID。",
"ProjectRunFunc": "_Dps_CrossBorderStones_Main_"
},
{
"Status": 0,
"FilePath": null,
"ProjectVersion": 1,
"ProjectName": "一键存入个人金库",
"ProjectAuthor": "倾泪寒 & 南瓜",
"Raw_Url": "http://103.36.223.176:5244/p/DP_S/Script/%E4%B8%80%E9%94%AE%E5%AD%98%E5%85%A5%E4%B8%AA%E4%BA%BA%E9%87%91%E5%BA%93/Proj.ifo?sign=m9ADj-5dEtouJaA36cHZWPhKTQMBZqGgt_V32OORoZk=:0",
"ProjectFiles": [
"一键入库.nut"
],
"ProjectConfig": "一键存入个人金库_Lenheart.json",
"ProjectDescribe": "使用之前,请务必保证安装了群内的 \"客户端消息框233.dll\" 插件,这个插件放入你客户端的插件加载目录即可,在游戏中输入 //yjcc 即可一键存入个人金库,也可以在游戏中的快捷喊话中添加为快捷键 配置中可更改 yjcc 关键字",
"ProjectRunFunc": "_Dps_OneClickStorage_Main_"
},
{
"Status": 0,
"FilePath": null,
"ProjectVersion": 1.2,
"ProjectName": "装备镶嵌与时装镶嵌",
"ProjectAuthor": "倾泪寒",
"Raw_Url": null,
"ProjectFiles": [
"装备镶嵌与时装镶嵌.nut"
],
"ProjectConfig": "装备镶嵌与时装镶嵌_Lenheart.json",
"ProjectDescribe": "使用之前,请务必保证安装了群内的 \"客户端消息框233.dll\" 插件,这个插件放入你客户端的插件加载目录即可\n如果你是0627的客户端版本还需要安装群内的 \"0627装备镶嵌.dll\" 插件",
"ProjectRunFunc": "_Dps_Equ2AvaJewel_Main_"
},
{
"Status": 0,
"FilePath": null,
"ProjectVersion": 1,
"ProjectName": "任务清除卷",
"ProjectAuthor": "南瓜",
"Raw_Url": "",
"ProjectFiles": [
"任务清除卷.nut"
],
"ProjectConfig": "任务相关配置_南瓜.json",
"ProjectDescribe": "清理各类型任务以及重置相关任务",
"ProjectRunFunc": "_Dps_QuestInfo_nangua_Main_"
},
{
"Status": 0,
"FilePath": null,
"ProjectVersion": 1,
"ProjectName": "副本播报",
"ProjectAuthor": "南瓜",
"Raw_Url": "",
"ProjectFiles": [
"副本播报.nut"
],
"ProjectConfig": "副本播报配置_Nangua.json",
"ProjectDescribe": "通关及未通关时播报耗时时长",
"ProjectRunFunc": "_Dps_send_dungeon_msg_Main_"
}
]

View File

@ -0,0 +1,13 @@
{
"FilePath": null,
"ProjectVersion": 1.4,
"ProjectName": "史诗药剂",
"ProjectAuthor": "倾泪寒 & 南瓜",
"Raw_Url": "http://103.36.223.176:5244/p/DP_S/Script/%E5%8F%B2%E8%AF%97%E8%8D%AF%E5%89%82/Proj.ifo?sign=-B9k-P4CX3Qm3d9hJpmaHhpFo14aFF1Rfh9d69M-f-8=:0",
"ProjectFiles": [
"史诗药剂.nut"
],
"ProjectConfig": "史诗药剂配置文件.json",
"ProjectDescribe": "通过指定ID的道具使玩家获得爆率加成。",
"ProjectRunFunc": "_Dps_EpicPotion_Main_"
}

3
version.json Executable file
View File

@ -0,0 +1,3 @@
{
"ProjectVersion": 3.42
}