This commit is contained in:
lenheart 2024-10-02 21:00:21 +08:00
parent 7f547f5fd4
commit 2d6e633410
16 changed files with 736 additions and 36 deletions

View File

@ -50,4 +50,46 @@ class GameManager extends Base_C_Object {
NativePointer("0x8542AD9").writeInt(time);
NativePointer("0x8542BDE").writeInt(time);
}
//开启创建鼠标妹
function OpenCreateJob_CreatorMage() {
Sq_WriteByteArr(S_Ptr("0x81C029F"), [0xf]);
}
//开启获得魔法封印时自动解除魔法封印
function OpenRandomAutomaticUnblocking() {
Cb_User_Insert_Item_Leave_Func.Rindro <- function(args) {
local SUser = User(NativePointer(args[0]).readPointer());
local InvenObj = SUser.GetInven();
local idx = args.pop();
if (idx > 0) {
local inven_item = InvenObj.GetSlot(1, idx);
local item_id = inven_item.GetIndex();
local pvfitem = PvfItem.GetPvfItemById(item_id);
//如果是魔法封印装备
if (!pvfitem.IsRandomOption()) {
return;
}
local random_option = NativePointer(inven_item.C_Object).add(37);
if (random_option.readU32() || random_option.add(4).readU32() || random_option.add(8).readShort()) {
return;
}
NativePointer(inven_item.C_Object).add(37).add(0).writeU8(1);
}
SUser.SendItemSpace(0);
return null;
}
}
//开启自动热重载
function OpenHotFix(Path = "/dp_s/MyProject") {
print("DP-S开启自动重载脚本功能,重载目录为: " + Path + " .");
print("请注意如果你不处于DP-S开发环境请关闭此功能以免对性能造成影响");
Sq_AutoReload(Path);
}
}
//热重载
function _Reload_List_Write_(Path) {
sq_RunScript(Path);
print("位于 [" + Path + "] 的脚本已重载")
}

View File

@ -0,0 +1,30 @@
/*
文件名:HackerClass.nut
路径:Dps_A/BaseClass/HackerClass/HackerClass.nut
创建日期:2024-09-22 11:33
文件用途:黑客类
*/
class _Hacker {
HookTable = null;
constructor() {
HookTable = {};
}
function UnLoadHook(AddressStr) {
Sq_DeHookFunc(HookTable[AddressStr]);
}
function LoadHook(AddressStr, ArgumentArr, EnterFunc, LeaveFunc) {
//如果已经HOOK过 需要先卸载原来的HOOK
if (HookTable.rawin(AddressStr)) {
UnLoadHook(AddressStr);
print("地址: " + AddressStr + " 已经装载了Hook,本次操作将会卸载之前的Hook在执行。")
}
local Controler = Sq_HookFunc(S_Ptr(AddressStr), ArgumentArr, EnterFunc, LeaveFunc);
HookTable.rawset(AddressStr, Controler);
}
}
//初始化Hacker
Haker <- _Hacker();

View File

@ -132,7 +132,4 @@ class Item extends Base_C_Object {
}
}

View File

@ -21,6 +21,52 @@ class MD5 {
Sq_CallFunc(MD5_Final_ptr, "void", ["pointer", "pointer"], Ctx, Result);
}
function base64_encode(input) {
local base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
local inputLength = input.len();
local i = 0;
local j = 0;
local charArray3 = array(3);
local charArray4 = array(4);
local encoded = "";
while (inputLength--) {
charArray3[i++] = input[inputLength];
if (i == 3) {
charArray4[0] = (charArray3[0] & 0xfc) >> 2;
charArray4[1] = ((charArray3[0] & 0x03) << 4) + ((charArray3[1] & 0xf0) >> 4);
charArray4[2] = ((charArray3[1] & 0x0f) << 2) + ((charArray3[2] & 0xc0) >> 6);
charArray4[3] = charArray3[2] & 0x3f;
for (i = 0; i< 4; i++) {
encoded += base64_chars[charArray4[i]];
}
i = 0;
}
}
if (i) {
for (j = i; j< 3; j++) {
charArray3[j] = 0;
}
charArray4[0] = (charArray3[0] & 0xfc) >> 2;
charArray4[1] = ((charArray3[0] & 0x03) << 4) + ((charArray3[1] & 0xf0) >> 4);
charArray4[2] = ((charArray3[1] & 0x0f) << 2) + ((charArray3[2] & 0xc0) >> 6);
charArray4[3] = charArray3[2] & 0x3f;
for (j = 0; j< i + 1; j++) {
encoded += base64_chars[charArray4[j]];
}
while (i++<3) {
encoded += "=";
}
}
return encoded;
}
function GetFile(FileName) {
local Io = IO(FileName, "r+");
@ -37,6 +83,6 @@ class MD5 {
local Result = Memory.alloc(16);
MD5.MD5_Final(Result.C_Object, Ctx.C_Object);
Io.Close();
return Result.readUtf8String(16);
return base64_encode(Result.readUtf8String(16));
}
}

View File

@ -231,8 +231,8 @@ class MysqlPool {
}
function GetInstance() {
// if (!(getroottable().rawin("_MysqlPoolObject"))) MysqlPool();
MysqlPool();
if (!(getroottable().rawin("_MysqlPoolObject"))) MysqlPool();
// MysqlPool();
return getroottable()._MysqlPoolObject;
}

View File

@ -55,9 +55,19 @@ class PvfItem extends Base_C_Object {
return PvfItem(Ret);
} else return null;
}
//Public
function GetPvfData(Idx) {
local Ret = Sq_CallFunc(S_Ptr("0x835FA32"), "pointer", ["pointer", "int"], Sq_CallFunc(S_Ptr("0x80CC19B"), "pointer", []), Idx);
return NativePointer(Ret);
//Public 是否是魔法封印
function IsRandomOption() {
return Sq_CallFunc(S_Ptr("0x8514E5E"), "int", ["pointer"], this.C_Object);
}
}
//获取穿戴等级
function PvfItem::GetUsableLevel() {
return Sq_CallFunc(S_Ptr("0x80F12EE"), "int", ["pointer"], this.C_Object);
}
//是否为消耗品
function PvfItem::IsStackable() {
return Sq_CallFunc(S_Ptr("0x80f12fa"), "int", ["pointer"], this.C_Object);
}

View File

@ -7,14 +7,18 @@
class Timer {
//执行任务队列树
Wait_Exec_Tree = null;
//定时执行任务队列树
Date_Exec_Tree = null;
constructor() {
Wait_Exec_Tree = RedBlackTree();
Date_Exec_Tree = RedBlackTree();
Cb_timer_dispatch_Func.rawset("__System__Timer__Event", Update.bindenv(this));
}
function Update() {
//检测延时任务
function CheckTimeOut() {
local Node = Wait_Exec_Tree.pop();
if (!Node) {
return;
@ -24,7 +28,7 @@ class Timer {
//执行时间
local exec_time = Node.time;
//如果没到执行时间,放回去,等待下次扫描
if (time() <= exec_time) {
if (clock() <= exec_time) {
Wait_Exec_Tree.insert(exec_time, Node.Info);
return;
}
@ -42,10 +46,10 @@ class Timer {
for (local i = 0; i< vargv.len(); i++) {
target_arg_list.push(vargv[i]);
}
//当前时间戳,单位:s
local time_sec = time();
//当前时间戳,单位:
local time_sec = clock();
//计算下一次执行的时间
local exec_time_sec = time_sec + (delay_time - 1);
local exec_time_sec = time_sec + (delay_time / 1000.0).tofloat();
//设置下一次执行
local func_info = [];
@ -55,4 +59,74 @@ class Timer {
_Timer_Object.Wait_Exec_Tree.insert(exec_time_sec, func_info);
}
//检测定时任务
function CheckCronTask() {
local Node = Date_Exec_Tree.pop();
if (!Node) {
return;
}
//取得函数体
local Info = Node.Info;
//执行时间
local exec_time = Node.time;
//如果没到执行时间,放回去,等待下次扫描
if (time() <= exec_time) {
Date_Exec_Tree.insert(exec_time, Node.Info);
return;
}
//函数
local func = Info[0];
//参数
local func_args = Info[1];
//下次任务叠加时间
local NextTimestep = Info[2];
//执行函数
func.acall(func_args);
//继续构建下一次任务
Date_Exec_Tree.insert(time() + NextTimestep, Info);
}
function SetCronTask(target_func, CronString, ...) {
local parts = split(CronString, "/");
local minute = parts[0].tointeger();
local hour = parts[1].tointeger();
local day = parts[2].tointeger();
local weekday = parts[3].tointeger();
local S_minute = minute * 60;
local S_hour = hour * 60 * 60;
local S_day = day * 24 * 60 * 60;
local S_weekday = weekday * 7 * 24 * 60 * 60;
local AddTimestep = S_minute + S_hour + S_day + S_weekday;
local NowTimestep = time();
//下一次执行的时间
local NextTimestep = AddTimestep + NowTimestep;
local target_arg_list = [];
target_arg_list.push(getroottable());
for (local i = 0; i< vargv.len(); i++) {
target_arg_list.push(vargv[i]);
}
//设置下一次执行
local func_info = [];
//函数体
func_info.push(target_func);
//参数列表
func_info.push(target_arg_list);
//间隔时间戳时间
func_info.push(AddTimestep);
_Timer_Object.Date_Exec_Tree.insert(NextTimestep, func_info);
}
function Update() {
CheckTimeOut();
CheckCronTask();
}
}

View File

@ -532,4 +532,71 @@ class User extends Base_C_Object {
if (Ret) return AccountCargo(Ret, this);
else return null;
}
}
//获取公会名称
function User::GetGuildName() {
return Sq_CallFunc(S_Ptr("0x869742a"), "string", ["pointer"], this.C_Object);
}
//获取副职业对象指针
function User::GetCurCharacExpertJob() {
return Sq_CallFunc(S_Ptr("0x822f8d4"), "pointer", ["pointer"], this.C_Object);
}
//获得角色副职业
function User::GetCurCharacExpertJobType() {
return Sq_CallFunc(S_Ptr("0x822f894"), "int", ["pointer"], this.C_Object);
}
//调用分解机
function User::DisPatcher_DisJointItem_disjoint(Slot, ...) {
local UseIdx = 239;
local UsePtr = this.C_Object;
if (vargv.len() > 1) {
UseIdx = vargv[0];
UsePtr = vargv[1];
}
return Sq_CallFunc(S_Ptr("0x81f92ca"), "int", ["pointer", "int", "int", "int", "pointer", "int"], this.C_Object, Slot, 0, UseIdx, UsePtr, 0xFFFF);
}
//发送Item邮件 Pubilc
function User::SendItemMail(UID, CID, ItemList, title, content) {
local SUser = World.GetUserByUid(UID);
local sql = "select letter_id from taiwan_cain_2nd.postal order by letter_id DESC";
local column_type_list = ["int"];
local SqlObj = MysqlPool.GetInstance().GetConnect();
local result = SqlObj.Select(sql, column_type_list);
local sl = 1;
if (result.len() > 0) {
sl = result[0][0] + 1;
}
local time = date();
local timeStr = time["year"] + "-" + (time["month"] + 1) + "-" + time["day"] + " " + time["hour"] + ":" + time["min"] + ":" + time["sec"];
foreach(value in ItemList) {
local sql1 = "insert into taiwan_cain_2nd.postal (occ_time,send_charac_name,receive_charac_no,amplify_option,amplify_value,seperate_upgrade,seal_flag,item_id,add_info,upgrade,gold,letter_id,avata_flag,creature_flag) values ('" + timeStr + "','" + title + "'," + CID + ",0,0,0,0," + value.item + "," + value.num + ",0,0," + sl + ",'0','0')";
SqlObj.Select(sql1, []);
}
local sql2 = "insert into taiwan_cain_2nd.letter (letter_id,charac_no,send_charac_name,letter_text,reg_date,stat) values ('" + sl + "'," + CID + ",'" + title + "','" + content + "','" + timeStr + "','1')";
SqlObj.Select(sql2, []);
MysqlPool.GetInstance().PutConnect(SqlObj);
if (SUser) {
local Pack = Packet();
Pack.Put_Header(0, 9);
local MailBox = Sq_CallFunc(S_Ptr("0x0823020C"), "int", ["pointer"], SUser.C_Object);
Sq_CallFunc(S_Ptr("0x0823455A"), "int", ["int"], MailBox);
local Not_Count = Sq_CallFunc(S_Ptr("0x084ED330"), "int", ["int"], MailBox);
Pack.Put_Short(Not_Count);
Pack.Finalize(true);
SUser.Send(Pack);
Pack.Delete();
}
}

View File

@ -193,6 +193,7 @@ Gm_InputFunc_Handle.T <- function(SUser, CmdString) {
SUser.SendNotiPacketMessage("GetCharacCount: " + SUser.GetCharacCount(), 8);
SUser.SendNotiPacketMessage("GetUID: " + SUser.GetUID(), 8);
SUser.SendNotiPacketMessage("GetCID: " + SUser.GetCID(), 8);
SUser.SendNotiPacketMessage("GetUni: " + SUser.GetUniqueId(), 8);
SUser.SendNotiPacketMessage("GetCharacJob: " + SUser.GetCharacJob(), 8);
SUser.SendNotiPacketMessage("GetCharacName: " + SUser.GetCharacName(), 8);
SUser.SendNotiPacketMessage("GetCharacLevel: " + SUser.GetCharacLevel(), 8);
@ -245,22 +246,242 @@ function TestThread(coro) {
}
function TestL() {
print("注册 1 秒后执行")
Timer.SetTimeOut(TestL, 1);
function TestCronTask(str) {
print(str);
print("定时任务已执行一次");
}
Gm_InputFunc_Handle.TTT <- function(SUser, CmdString) {
// Timer.SetCronTask(TestCronTask, "1/0/0/0", "测试字符串参数");
// print("注册任务");
// Sq_AutoReload("/dp_s/MyProject");
// local ms = 2000;
// 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; // 补全毫秒数为两位
// }
// print(str);
// User.SendItemMail(1, 7, [{
// itemId = 3037,
// num = 100
// }, {
// itemId = 3038,
// num = 100
// }], "给你", "东西");
// Sq_CallFunc(S_Ptr("0x86C5A84"), "pointer", ["pointer", "pointer", "int", "int", "int", "int", "int", "int", "int", "int", "int"], Sq_Get_GameWorld(), SUser.C_Object, 1, 1, 200, 200, 0, 0, 0, 0, 0);
// Haker.LoadHook(S_Ptr("0x86C5A84"),
// ["pointer", "pointer", "int", "int", "int", "int", "int", "int", "int", "int", "int", "pointer"],
// function(args) {
// print(args[0]);
// print(Sq_Get_GameWorld());
// print(args[2]);
// print(args[3]);
// print(args[4]);
// print(args[5]);
// print(args[6]);
// print(args[7]);
// print(args[8]);
// print(args[9]);
// print(args[10]);
// return null;
// },
// function(args) {
// return null;
// });
local md5 = MD5.GetFile("/dp_s/a.txt");
print("Md5文本值: " + md5);
local Arr = [];
foreach(char in md5) {
Arr.append(char.tointeger());
}
print("Md5字符值>>>");
printT(Arr);
// local Sm = Memory.alloc(200);
// Sq_CallFunc(S_Ptr("0x8AA5CBA"), "int", ["pointer", "int", "pointer"], S_Ptr("0x949B140"), 7, Sm.C_Object);
// local Bsa = Sq_Point2Blob(Sm.C_Object, 120);
// local str = "["
// foreach(value in Bsa) {
// str += value;
// str += ","
// }
// str += "]";
// print(str);
// print("字符串: " + Sm.readUtf8String());
// getroottable()._nut_file_md5_table.rawset(file_name, file_md5_string);
// local opendirAddr = Module.getExportByName(null, "opendir");
// function open_dir(dir_path) {
// local path_ptr = Memory.allocUtf8String(dir_path).C_Object;
// return Sq_CallFunc(opendirAddr, "pointer", ["pointer"], path_ptr);
// }
// local dir_pointer = open_dir("/dp_s/");
// print("dir_pointer = " + dir_pointer);
// local Pack = Packet();
// Pack.Put_Header(1, 83);
// Pack.Put_Byte(1);
// Pack.Put_Byte(11)
// Pack.Put_Short(8195);
// Pack.Put_Int(1);
// Pack.Put_Short(65535);
// Pack.Put_Byte(1);
// Pack.Put_Byte(12);
// Pack.Put_Byte(1);
// Pack.Put_Byte(13);
// Pack.Put_Byte(25);
// Pack.Finalize(true);
// SUser.Send(Pack);
// Pack.Delete();
// GameManager.SetGameMaxLevel(95);
// Sq_HookFunc();
// Sq_HookFunc(S_Ptr("0x8678526"),
// 2,
// function(a,args) {
// print("AAA动态HOOK成功 城镇移动HOOK");
// print(CUser);
// print(id);
// },
// function(a,args) {
// print("AAA动态HOOK成功 城镇移动HOOK");
// print(CUser);
// print(id);
// });
//给角色发消息var CUser_SendNotiPacketMessage = new NativeFunction(ptr(0x86886CE), 'int', ['pointer', 'pointer', 'int'], { "abi": "sysv" });
// Sq_CallFunc(S_Ptr("0x86886CE"), "int", ["pointer", "pointer","int"], SUser.C_Object, Memory.allocUtf8String("测试信息"),14);
// Sq_HookFunc(S_Ptr("0x8678526"),
/*
// 发包
Haker.LoadHook("0x86485BA", ["pointer", "pointer", "int"],
function(args) {
print(args[0]);
local Pack = NativePointer(args[1]);
Pack = NativePointer(Pack.readPointer());
local headIndex = Pack.add(0x19).readU16();
if (headIndex == 83) {
print("发了83包");
// local Bo = Sq_Point2Blob(args[1], 100);
// local Str = "[";
// foreach(Value in Bo) {
// Str = format("%s%02X", Str, Value);
// Str += ",";
// }
// Str += "]";
// print(Str);
// local bufftype = Pack.add(0x28).readU8();
// local itemSlot = Pack.add(0x29).readU16();
// local itemCount = Pack.add(0x2B).readU32();
// local upType = Pack.add(0x31).readU8();
// local ret = Pack.add(0x33).readU8();
// local newUpLevel = Pack.add(0x34).readU8();
// local equSlot = Pack.add(0x35).readU16();
// print("bufftype: " + bufftype);
// print("itemSlot: " + itemSlot);
// print("itemCount: " + itemCount);
// print("upType: " + upType);
// print("ret: " + ret);
// print("newUpLevel: " + newUpLevel);
// print("equSlot: " + equSlot);
}
return null;
},
function(args) {
return null;
});
Haker.LoadHook("0x080FC850", ["pointer", "pointer", "pointer", "int", "void"],
function(args) {
// local Arr = [0x95, 0xDA, 0xF6, 0x12, 0x25, 0xDF, 0xE0, 0x0B, 0x48, 0xDF, 0xCC, 0xC6, 0x95, 0xDA, 0x31, 0x3F, 0xC1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x14, 0x00, 0xBE, 0x6B, 0x00, 0x00, 0xFF, 0xFF, 0x3C, 0x00, 0x00, 0x00, 0x00, 0xE5, 0xB9, 0xB8, 0xE5, 0xAD, 0x98, 0xE8, 0x80, 0x85, 0xE7, 0x9A, 0x84, 0xE5, 0xA5, 0xA7, 0xE7, 0xA5, 0x95];
// Sq_Memory_WriteByteArr(args[2], Arr);
// local Address = NativePointer(args[2]).add(35);
// NativePointer(Address).writeU8(0x3c);
// // local Address2 = NativePointer(args[2]).add(36);
// NativePointer(Address).writeShort(65535);
// NativePointer(Address2).writeShort(0x3E);
local Bo = Sq_Point2Blob(args[2], 100);
local Str = "[";
foreach(Value in Bo) {
Str = format("%s%02X", Str, Value);
Str += ",";
}
Str += "]";
print(Str);
return null;
},
function(args) {
local Pos = NativePointer(args[2]).add(27).readU16();
local SUser = User(args[1]);
SUser.SendUpdateItemList(1, 0, Pos);
// local Pack = Packet();
// Pack.Put_Header(1, 83);
// Pack.Put_Byte(1);
// Pack.Put_Byte(11)
// Pack.Put_Short(8195);
// Pack.Put_Int(0);
// Pack.Put_Short(65535);
// Pack.Put_Byte(0);
// Pack.Put_Byte(30);
// Pack.Put_Byte(0);
// Pack.Put_Byte(31);
// Pack.Put_Byte(25);
// Pack.Finalize(true);
// SUser.Send(Pack);
// Pack.Delete();
return null;
});
*/
// Sq_CallFunc(S_Ptr("0x84ECAA2"), "pointer", ["pointer", "float"], SUser.C_Object, 5.5);
/*
function(args) {
print("AAA动态HOOK成功 城镇移动HOOK");
print(CUser);
print(id);
}
*/
// local md5 = MD5.GetFile("/dp_s/a.txt");
// print("Md5文本值: " + md5);
// local Arr = [];
// foreach(char in md5) {
// Arr.append(char.tointeger());
// }
// print("Md5字符值>>>");
// printT(Arr);
// local Io = IO("/dp_s/a.txt", "r+");
@ -336,19 +557,34 @@ Gm_InputFunc_Handle.TTT <- function(SUser, CmdString) {
// Timer.SetTimeOut(function() {
// print("注册 2 秒后执行")
// }, 2);
};
Gm_InputFunc_Handle.AAA <- function(SUser, CmdString) {
//查询的sql语句
local sql = "SELECT m_id,charac_name,lev,village,job,exp,Hp FROM charac_info WHERE charac_no = 1;";
//查询的元素类型按sql中的顺序
local column_type_list = ["int", "string", "int", "int", "int", "int", "int"];
// //查询的sql语句
// local sql = "SELECT m_id,charac_name,lev,village,job,exp,Hp FROM charac_info WHERE charac_no = 1;";
// //查询的元素类型按sql中的顺序
// local column_type_list = ["int", "string", "int", "int", "int", "int", "int"];
// local SqlObj = MysqlPool.GetInstance().GetConnect();
// local result = SqlObj.Select(sql, column_type_list);
// printT(result);
// MysqlPool.GetInstance().PutConnect(SqlObj);
//从池子拿连接
local SqlObj = MysqlPool.GetInstance().GetConnect();
//建库
local sql = "SELECT slot FROM frida.setCharacSlotLimit WHERE account_id = " + account_id + ";";
local column_type_list = ["int"];
local result = SqlObj.Select(sql, column_type_list);
if (result.len() > 0) {
printT(result);
}
//把连接还池子
MysqlPool.GetInstance().PutConnect(SqlObj);
};

View File

@ -45,7 +45,6 @@ class ServerControl {
}
constructor() {
//分发来自网关的包
GatewaySocketPackFuncMap.rawset(20240730, function(Jso) {
local UserList = [];
@ -75,9 +74,25 @@ class ServerControl {
}
}
}.bindenv(this));
//给频道所有玩家分发网关的包
GatewaySocketPackFuncMap.rawset(20240806, function(Jso) {
Jso.op <- Jso.realop;
local Str = Json.Encode(Jso);
Str = removeBackslashes(Str);
local Pack = Packet();
Pack.Put_Header(1, 130);
Pack.Put_Byte(1);
Pack.Put_Int(Str.len());
Pack.Put_Binary(Str);
Pack.Finalize(true);
World.SendAll(Pack);
Pack.Delete();
}.bindenv(this));
//给查询指定uid cid列表的玩家信息
GatewaySocketPackFuncMap.rawset(2023101902, function(Jso) {
local UserList = [];
@ -172,6 +187,7 @@ class ServerControl {
Cb_Use_Item_Sp_Func[ItemId] <- function(SUser, ItemId) {
local T = {
op = RealOp,
itemId = ItemId,
uid = SUser.GetUID(),
cid = SUser.GetCID()
};
@ -246,6 +262,14 @@ class ServerControl {
}
});
//给指定玩家下发邮件
GatewaySocketPackFuncMap.rawset(20240928, function(Jso) {
local UID = Jso.uid;
local CID = Jso.cid;
User.SendItemMail(UID, CID, Jso.result, Jso.title, Jso.content);
});
//给指定队伍设置复活币数量
GatewaySocketPackFuncMap.rawset(20240804, function(Jso) {
local UID = Jso.uid;
@ -396,8 +420,8 @@ class ServerControl {
//给注册玩家通关副本
GatewaySocketPackFuncMap.rawset(2023110704, function(Jso) {
local RealOp = Jso.realop;
Cb_BossDie_Func[RealOp] <- function(SUser) {
local PartyObj = SUser.GetParty();
Cb_ClearDungeon_Enter_Func[RealOp] <- function(arg) {
local PartyObj = Party(arg[0]);
if (PartyObj) {
local Bfobj = PartyObj.GetBattleField();
local DgnObj = Bfobj.GetDgn();

View File

@ -0,0 +1,44 @@
/*
文件名:MarrySystem.nut
路径:Dps_A/ProjectClass/MarrySystem/MarrySystem.nut
创建日期:2024-10-01 10:02
文件用途:结婚系统
*/
class Marry {
//包头
OP = 20078000;
//查看是否结婚
function CheckMarryCallBack(SUser, Jso) {
// print("申请查看结婚信息的人是: " + SUser.GetCharacName());
local T = {
op = OP + 2,
Flag = false, //结婚返回true 未结婚返回flase
}
SUser.SendJso(T);
}
//申请结婚
function RequestMarry(SUser, Jso) {
local PSUser = World.GetUserByName(Jso.Name);
if (PSUser) {
local T = {
op = OP + 3,
cid = SUser.GetCID(),
cid2 = PSUser.GetCID(),
}
Socket.SendGateway(T);
}
}
constructor() {
//注册来自客户端的收包
ClientSocketPackFuncMap.rawset(OP + 1, CheckMarryCallBack.bindenv(this));
ClientSocketPackFuncMap.rawset(OP + 3, RequestMarry.bindenv(this));
}
}
ProjectInitFuncMap.P_Marry <- Marry();

View File

@ -3,6 +3,8 @@ getroottable().DebugModelFlag <- false;
function InitPluginInfo() {
//初始化定时器
_Timer_Object <- Timer();
//初始化自动重载
GameManager.OpenHotFix("/dp_s/Dps_A");
local PoolObj = MysqlPool.GetInstance();
PoolObj.SetBaseConfiguration("127.0.0.1", 3306, "game", "uu5!^%jg");
@ -11,6 +13,17 @@ function InitPluginInfo() {
//初始化
PoolObj.Init();
//从池子拿连接
local SqlObj = MysqlPool.GetInstance().GetConnect();
//建库
SqlObj.Select("create database if not exists frida default charset utf8;", []);
SqlObj.Select("CREATE TABLE `frida`.`setCharacSlotLimit` (`account_id` INT NOT NULL,`slot` INT NOT NULL DEFAULT 2,PRIMARY KEY (`account_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;", []);
//把连接还池子
MysqlPool.GetInstance().PutConnect(SqlObj);
// Sq_CreatCConnectPool(2, 4, "127.0.0.1", 3306, "game", "uu5!^%jg");
Sq_CreatSocketConnect("192.168.200.24", "65109");
}

109
Dps_C/New_Hook.nut Normal file
View File

@ -0,0 +1,109 @@
/*
文件名:New_Hook.nut
路径:Dps_A/New_Hook.nut
创建日期:2024-09-23 20:15
文件用途:后续新增的玩家需求的HOOK
*/
//通用HOOK入口函数
function _Hook_Enter_Currency_Func_(args, TableObj) {
local Ret = null;
foreach(Func in TableObj) {
local Buf = Func(args);
if (Buf) Ret = Buf;
}
return Ret;
}
//通用HOOK出口函数
function _Hook_Leave_Currency_Func_(args, TableObj) {
local Ret = null;
foreach(Func in TableObj) {
local Buf = Func(args);
if (Buf) Ret = Buf;
}
return Ret;
}
//通用注册HOOK函数
function _Hook_Register_Currency_Func_(AddressString, ArgRetArr, EnterTable, LeaveTable) {
Haker.LoadHook(AddressString, ArgRetArr,
function(args) {
return _Hook_Enter_Currency_Func_(args, EnterTable);
},
function(args) {
return _Hook_Leave_Currency_Func_(args, LeaveTable);
}
);
}
//玩家新增道具时
Cb_User_Insert_Item_Enter_Func <- {};
Cb_User_Insert_Item_Leave_Func <- {};
_Hook_Register_Currency_Func_("0x8502D86", ["pointer", "pointer", "int", "int", "int", "int", "int", "int", "int", "int", "int", "int", "int", "int", "int", "char", "int", "char", "char", "int"], Cb_User_Insert_Item_Enter_Func, Cb_User_Insert_Item_Leave_Func);
//玩家捡起道具
Cb_User_Get_Item_Enter_Func <- {};
Cb_User_Get_Item_Leave_Func <- {};
_Hook_Register_Currency_Func_("0x85B949C", ["pointer", "pointer", "int", "int", "int"], Cb_User_Get_Item_Enter_Func, Cb_User_Get_Item_Leave_Func);
//服务器Chat日志HOOK
Cb_Server_Chat_Log_Enter_Func <- {};
Cb_Server_Chat_Log_Leave_Func <- {};
_Hook_Register_Currency_Func_("0x86C9638", ["pointer", "pointer", "char", "string", "char"], Cb_Server_Chat_Log_Enter_Func, Cb_Server_Chat_Log_Leave_Func);
//玩家上线设置IP
Cb_User_Set_WebAddress_Enter_Func <- {};
Cb_User_Set_WebAddress_Leave_Func <- {};
_Hook_Register_Currency_Func_("0x84EC918", ["pointer", "pointer", "pointer"], Cb_User_Set_WebAddress_Enter_Func, Cb_User_Set_WebAddress_Leave_Func);
//服务端关闭执行函数
Cb_Server_Close_Enter_Func <- {};
Cb_Server_Close_Leave_Func <- {};
_Hook_Register_Currency_Func_("0x829F28B", ["pointer", "pointer"], Cb_Server_Close_Enter_Func, Cb_Server_Close_Leave_Func);
//检查地下城的状况
Cb_CheckInoutConditionDungeon_Enter_Func <- {};
Cb_CheckInoutConditionDungeon_Leave_Func <- {};
_Hook_Register_Currency_Func_("0x85ABC80", ["pointer", "pointer", "int", "int"], Cb_CheckInoutConditionDungeon_Enter_Func, Cb_CheckInoutConditionDungeon_Leave_Func);
//地下城现场杀死地狱党组怪物Cnt
Cb_Field_KillHellPartyGroupMonsterCnt_Enter_Func <- {};
Cb_Field_KillHellPartyGroupMonsterCnt_Leave_Func <- {};
_Hook_Register_Currency_Func_("0x830D704", ["pointer", "pointer", "pointer", "bool"], Cb_Field_KillHellPartyGroupMonsterCnt_Enter_Func, Cb_Field_KillHellPartyGroupMonsterCnt_Leave_Func);
//经验收益
Cb_Gain_Exp_Sp_Enter_Func <- {};
Cb_Gain_Exp_Sp_Leave_Func <- {};
_Hook_Register_Currency_Func_("0x866A3FE", ["pointer", "int", "int", "int", "int", "int", "char"], Cb_Gain_Exp_Sp_Enter_Func, Cb_Gain_Exp_Sp_Leave_Func);
//货币收益
Cb_Gain_Money_Enter_Func <- {};
Cb_Gain_Money_Leave_Func <- {};
_Hook_Register_Currency_Func_("0x84FF29C", ["int", "int", "char", "int", "int"], Cb_Gain_Money_Enter_Func, Cb_Gain_Money_Leave_Func);
//GetItem检查错误
Cb_GetItem_Check_Error_Enter_Func <- {};
Cb_GetItem_Check_Error_Leave_Func <- {};
_Hook_Register_Currency_Func_("0x81C35AC", ["pointer", "pointer", "pointer", "int"], Cb_GetItem_Check_Error_Enter_Func, Cb_GetItem_Check_Error_Leave_Func);
//队伍清除副本
Cb_ClearDungeon_Enter_Func <- {};
Cb_ClearDungeon_Leave_Func <- {};
_Hook_Register_Currency_Func_("0x85a9330", ["pointer", "void"], Cb_ClearDungeon_Enter_Func, Cb_ClearDungeon_Leave_Func);
//检查选择进入副本时状态
Cb_SelectDungeon_Check_Error_Enter_Func <- {};
Cb_SelectDungeon_Check_Error_Leave_Func <- {};
_Hook_Register_Currency_Func_("0x81C7F32", ["pointer", "pointer", "pointer", "int"], Cb_SelectDungeon_Check_Error_Enter_Func, Cb_SelectDungeon_Check_Error_Leave_Func);
//切换装备
Cb_CInventory_ChangeEquip_Enter_Func <- {};
Cb_CInventory_ChangeEquip_Leave_Func <- {};
_Hook_Register_Currency_Func_("0x84FC37E", ["pointer", "int", "pointer", "int"], Cb_CInventory_ChangeEquip_Enter_Func, Cb_CInventory_ChangeEquip_Leave_Func);
//获取通关时间回调
Cb_CParty_SetBestClearTime_Enter_Func <- {};
Cb_CParty_SetBestClearTime_Leave_Func <- {};
_Hook_Register_Currency_Func_("0x85BE178", ["pointer", "char", "int", "int", "bool"], Cb_CParty_SetBestClearTime_Enter_Func, Cb_CParty_SetBestClearTime_Leave_Func);

2
MyProject/asas.nut Normal file
View File

@ -0,0 +1,2 @@
print("aaaa");
print("aaaa");

View File

@ -127,5 +127,11 @@
},
"Dps_A/BaseClass/MD5Class": {
"description": "MD5类"
},
"Dps_A/BaseClass/HackerClass": {
"description": "黑客类"
},
"Dps_A/BaseClass/HotFixClass": {
"description": "热更新"
}
}

Binary file not shown.