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