111
This commit is contained in:
@@ -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 + "] 的脚本已重载")
|
||||
}
|
||||
30
Dps_A/BaseClass/HackerClass/HackerClass.nut
Normal file
30
Dps_A/BaseClass/HackerClass/HackerClass.nut
Normal 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();
|
||||
@@ -132,7 +132,4 @@ class Item extends Base_C_Object {
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
@@ -231,8 +231,8 @@ class MysqlPool {
|
||||
}
|
||||
|
||||
function GetInstance() {
|
||||
// if (!(getroottable().rawin("_MysqlPoolObject"))) MysqlPool();
|
||||
MysqlPool();
|
||||
if (!(getroottable().rawin("_MysqlPoolObject"))) MysqlPool();
|
||||
// MysqlPool();
|
||||
return getroottable()._MysqlPoolObject;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user