This commit is contained in:
lenheart
2025-04-21 13:36:35 +08:00
parent eeb773e723
commit 2ef9cfef42
87 changed files with 2134 additions and 765 deletions

View File

@@ -279,8 +279,7 @@ class GameManager extends Base_C_Object {
function FixInvasion() {
NativePointer("0x81DB4EA").writeS8(0x00);
getroottable()._TH_MEM_K_ <- Memory.allocUtf8String("/");
{
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);
@@ -293,8 +292,7 @@ class GameManager extends Base_C_Object {
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);
@@ -310,6 +308,30 @@ class GameManager extends Base_C_Object {
}
}
//修复练习模式
function FixPracticemode() {
Sq_WriteByteArr(S_Ptr("0x81C820A"), [0xE9, 0xC6, 0x0, 0x0, 0x0, 0x90]);
}
//修复黑暗武士技能
function FixDarkWarriorSkillBar()
{
Cb_CheckMoveComboSkillSlot_Leave_Func["DPSOFF"] <- function (args)
{
return true;
}
}
// //调用群助手发送消息
// function GroupAssistantSendAMessage() {
// //私有方法 发送带参数的Post请求
// local SO = Http("129.211.27.104", "9080");
// local Res = SO.Post("/dof/chat", Json.Encode({
// username = "倾泪寒",
// text = "倾泪寒爆史诗了!",
// groupId = 416424738
// }), "application/json");
// }
}
//热重载
getroottable()._HotFixPath_ <- {};
@@ -318,22 +340,34 @@ 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);
Timer.SetTimeOut(function() {
//判断类型
if (endswith(Path, ".nut")) {
dofile(Path);
print("位于 [" + Path + "] 的脚本已重载")
} else if (endswith(Path, ".json")) {
try {
local PArr = split(Path, "/");
local RealName = PArr[PArr.len() - 1];
print("位于 [" + Path + "] 的配置已重载");
//在载入新配置之前 先拿到旧配置保存起来
local OldConfig = GlobalConfig.Get(RealName);
GlobalConfig.LoadJson(RealName, Path);
} catch (exception) {
//如果存在项目 并且有重载入口 则调用重载入口
if (_GlobalOfficial_Project.ReloadProjectMap.rawin(RealName)) {
local ProjectStartFunc = _GlobalOfficial_Project.ReloadProjectMap[RealName];
if (getroottable().rawin(ProjectStartFunc + "Reload_")) {
getroottable()[ProjectStartFunc + "Reload_"](OldConfig);
}
}
print("位于 [" + Path + "] 的配置已重载");
} catch (exception) {
}
}
}
}, 500)
getroottable()._HotFixPathChangeTimer_[Path] <- NowTime;
}
}

View File

@@ -24,12 +24,12 @@ class Http {
return encoded;
}
function Request(Type, Url, Content) {
function Request(Type, Url, Content, DataType) {
local RequestBuffer = Type + " " + Url + " HTTP/1.1\r\nHost: " + Host + "\r\n";
if (Content) {
RequestBuffer += "Content-Length: " + Content.len() + "\r\n";
RequestBuffer += "Content-Type: application/x-www-form-urlencoded\r\n";
RequestBuffer += "Content-Type: " + DataType + "\r\n";
RequestBuffer += "\r\n";
RequestBuffer += Content;
} else {
@@ -39,16 +39,19 @@ class Http {
}
// 发送请求
function Post(Url, params = null) {
function Post(Url, params = null, DataType = "application/x-www-form-urlencoded") {
local content = null;
if (params != null && typeof params == "table") {
content = _EncodeParams(params); // 编码参数
}
return Request("POST", Url, content);
else if (params != null && typeof params == "string") {
content = params;
}
return Request("POST", Url, content, DataType);
}
function Get(Url, Content = null) {
return Request("GET", Url, Content);
function Get(Url, Content = null, DataType = "application/x-www-form-urlencoded") {
return Request("GET", Url, Content, DataType);
}
@@ -243,8 +246,7 @@ class HttpResponse {
response += "Content-Length: " + JsonString.len() + "\r\n";
response += "\r\n";
response += JsonString;
}
else if(typeof Msg == "string") {
} else if (typeof Msg == "string") {
response += "Content-Type: text/plain\r\n";
response += "Content-Length: " + Msg.len() + "\r\n";
response += "\r\n";

View File

@@ -33,6 +33,11 @@ class Inven extends Base_C_Object {
return Sq_Inven_GetItemById(this.C_Object, Idx);
}
//获取金币
function GetMoney() {
return Sq_CallFunc(S_Ptr("0x817a188"), "int", ["pointer"], SUser.C_Object);
}
//检查背包是否拥有指定数量的指定道具
function CheckItemCount(ItemId, ItemCount) {
if (ItemId == 0) {

View File

@@ -4,41 +4,60 @@
创建日期: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";
class _Official_Project_ {
ReloadProjectMap = null;
constructor() {
//在全局中注册自己
getroottable()._GlobalOfficial_Project <- this;
ReloadProjectMap = {};
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));
Init();
}
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);
function Init() {
// 定义 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 {
//读取配置文件建立Map
local ProjectConfig = Config.ProjectConfig;
if(ProjectConfig.len() > 0){
ReloadProjectMap.rawset(ProjectConfig,Config.ProjectRunFunc);
}
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));
}
//调用启动函数
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

@@ -91,6 +91,7 @@ class Packet extends Base_C_Object {
return null;
}
function GetBinary(len) {
local data = Memory.alloc(len);
if (Sq_CallFunc(S_Ptr("0x858D3B2"), "int", ["pointer", "pointer"], this.C_Object, data.C_Object)) {
@@ -99,6 +100,14 @@ class Packet extends Base_C_Object {
return null;
}
function GetString(a3,a4) {
local data = Memory.alloc(a3);
if (Sq_CallFunc(S_Ptr("0x858D2BC"), "int", ["pointer", "pointer","int","int","int"], this.C_Object, data.C_Object,a3,a4)) {
return data;
}
return null;
}
function Delete() {
Sq_CallFunc(S_Ptr("0x858DE80"), "void", ["pointer"], this.C_Object);
Sq_Delete_Point(this.C_Object);

View File

@@ -13,6 +13,8 @@ class RBTreeNode {
parent = null;
color = null;
Info = null;
name = null;
constructor(key, func_info) {
this.key = key;
this.time = key;
@@ -43,7 +45,7 @@ class RedBlackTree {
this.root = this.nil;
}
function insert(key, func_info) {
function insert(key, func_info, gname = null) {
local z = RBTreeNode(key, func_info);
local y = this.nil;
local x = this.root;
@@ -66,6 +68,7 @@ class RedBlackTree {
z.left = this.nil;
z.right = this.nil;
z.color = "red";
if (gname) z.name = gname;
this.insertFixup(z);
this.size++;
}
@@ -286,4 +289,26 @@ class RedBlackTree {
}
return null;
}
function findNodeByName(node,name) {
if (node == this.nil) {
return null;
}
if (node.name == name) {
return node;
}
local leftResult = findNodeByName(node.left, name);
if (leftResult) {
return leftResult;
}
return findNodeByName(node.right, name);
}
// 新增方法:根据 name 移除节点
function removeNodeByName(name) {
local targetNode = this.findNodeByName(this.root,name);
if (targetNode) {
this.deleteNode(targetNode);
}
}
}

View File

@@ -88,12 +88,24 @@ class Timer {
//Cron字符串
local NextTimestep = Info[2];
//执行函数
func.acall(func_args);
local Flag = func.acall(func_args);
//继续构建下一次任务
Date_Exec_Tree.insert(Sq_Cron_Next(NextTimestep, time()), Info);
if(Flag == null || Flag == true) Date_Exec_Tree.insert(Sq_Cron_Next(NextTimestep, time()), Info, Node.name);
}
function SetCronTask(target_func, CronString, ...) {
function SetCronTask(target_func, build_info, ...) {
local CronString = "";
local TaskName = null;
//如果是字符串直接就是Cron字符串
if (typeof build_info == "string") {
CronString = build_info;
}
//如果是Table 则有名字
else if (typeof build_info == "table") {
CronString = build_info.Cron;
TaskName = build_info.Name;
}
local NowTimestep = time();
//下一次执行的时间
@@ -115,7 +127,11 @@ class Timer {
//间隔时间戳时间
func_info.push(CronString);
_Timer_Object.Date_Exec_Tree.insert(NextTimestep, func_info);
_Timer_Object.Date_Exec_Tree.insert(NextTimestep, func_info, TaskName);
}
function RemoveCronTask(name) {
_Timer_Object.Date_Exec_Tree.removeNodeByName(name);
}
function Update() {

View File

@@ -777,4 +777,71 @@ function User::DropItem(ItemId, Xpos, Ypos) {
Sq_WriteByteArr(S_Ptr("0x85A773C"), [0x89, 0x44, 0x24, 0x04, 0x8B, 0x45, 0x08]);
NativePointer("0x085A7599").writeShort(300);
NativePointer("0x085A759F").writeShort(240);
}
//角色类 发送邮件函数 (标题, 正文, 金币, 道具列表[[3037,100],[3038,100]])
function User::ReqDBSendMultiMail(title, text, gold, item_list) {
Timer.SetTimeOut(function(SUser,title, text, gold, item_list) {
local Cid = SUser.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);
}
}
}, 1,this,title, text, gold, item_list);
}

View File

@@ -138,6 +138,21 @@ Gm_InputFunc_Handle["完成任务"] <- function(SUser, CmdString) {
}
Gm_InputFunc_Handle["测试"] <- function(SUser, CmdString) {
SUser.ClearQuest_Gm(674);
SUser.ClearQuest_Gm(649);
SUser.ClearQuest_Gm(675);
SUser.ClearQuest_Gm(650);
}
Cb_History_MileageSet_Func["_DPS_上线自动完成任务_"] <- function(SUser, Data) {
SUser.ClearQuest_Gm(101);
}
Gm_InputFunc_Handle.M <- function(SUser, CmdString) {
local PartyObj = SUser.GetParty();
// Sq_CallFunc(S_Ptr("0x85A73A6"), "int", ["pointer", "pointer", "int"], PartyObj.C_Object, SUser.C_Object, 3037);
@@ -302,6 +317,8 @@ function TestCronTask(str) {
Gm_InputFunc_Handle.WEQ <- function(SUser, CmdString) {
// // World.MoveArea(SUser, 1, 0, 55, 349);
@@ -333,6 +350,9 @@ Gm_InputFunc_Handle.WEQ <- function(SUser, CmdString) {
};
Gm_InputFunc_Handle.QS <- function(SUser, CmdString) {
SUser.RechargeCeraPoint(10000);
};
@@ -357,103 +377,250 @@ function UserdataSliceStr(Data) {
return Ret;
}
// MultiMailBoxCloseRindroMap <- null;
// Cb_MultiMailBoxReqSend_Enter_Func.CloseRindro <- function(args) {
// MultiMailBoxCloseRindroMap = Memory.alloc(144370 * 4);
// MultiMailBoxCloseRindroMap.add(144369 * 4).writeInt(0);
// args[1] = MultiMailBoxCloseRindroMap.C_Object;
// return args;
// }
// Cb_MultiMailBoxReqSend_Leave_Func.CloseRindro <- function(args) {
// MultiMailBoxCloseRindroMap = null;
// }
// //Hook
/*
//品级对应的RGB
rarityColorMap <- {
"0": [255, 255, 255], // 普通
"1": [104, 213, 237], // 高级
"2": [179, 107, 255], // 稀有
"3": [255, 0, 255], // 神器
"4": [255, 180, 0], // 史诗
"5": [255, 102, 102], // 勇者
"6": [255, 20, 147], // 深粉红色
"7": [255, 215, 0] // 金色
};
function xorEncryptDecrypt(BlobObj, Key) {
for (local i = 0; i< Key.len(); i++) {
local currentKeyChar = Key[i % Key.len()];
BlobObj[i] = BlobObj[i] ^ currentKeyChar;
//通过道具ID获取RGB
function RarityColor(item_id) {
local PvfItemObj = PvfItem.GetPvfItemById(item_id);
if (PvfItemObj == null) {
return;
}
local Arr = [];
foreach(value in BlobObj) {
Arr.append(value);
}
return Arr;
local CItem_get_rarity = PvfItemObj.GetRarity(); // 装备品级
return rarityColorMap[(CItem_get_rarity).tostring()];
}
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;
user_equ_plan <- {};
for (i = 0; i< 4; i++) {
encoded += base64_chars[charArray4[i]];
function GetEquip(SUser) {
//获取玩家背包
local InvenObj = SUser.GetInven();
if (!InvenObj) {
return;
}
local equArr = {};
// 读穿戴装备(10-21) + 时装(0-9)
for (local i = 0; i< 26; i++) {
// // 跳过非上衣时装若需要换全部时装注释掉这段if
// if (i != 3 && (i < 10 || i > 21)) {
// equArr[i] <- {
// "id": 0,
// "lv": 0
// };
// continue;
// }
local ItemObj = InvenObj.GetSlot(0, i);
local equId = ItemObj.GetIndex();
local item_upgrade = ItemObj.GetUpgrade();
local item_name = PvfItem.GetNameById(equId);
if (item_upgrade > 0) {
item_name = "+" + item_upgrade + " " + item_name;
}
//id:装备id lv:时装数据库uid/装备品级
equArr[i] <- {
"id": equId > 0 ? equId : 0,
"lv": equId > 0 ? NativePointer(ItemObj.C_Object).add(7).readU32() : 0
};
if (equId > 0) {
local AdMsgObj = AdMsg();
AdMsgObj.PutType(2);
AdMsgObj.PutString(" ");
AdMsgObj.PutEquipment("[" + item_name + "]", ItemObj, RarityColor(equId));
AdMsgObj.PutString("已登记");
AdMsgObj.Finalize();
SUser.Send(AdMsgObj.MakePack());
AdMsgObj.Delete();
}
}
return equArr;
}
function SaveEquipPlan(SUser, id) {
local charac_no = SUser.GetCID().tostring();
if (!(charac_no in user_equ_plan)) {
user_equ_plan[charac_no] <- {};
}
local info = GetEquip(SUser);
user_equ_plan[charac_no]["equPlan" + id] <- info;
local AdMsgObj = AdMsg();
AdMsgObj.PutType(2);
AdMsgObj.PutString(" ");
AdMsgObj.PutString("方案[" + id + "]已启用");
AdMsgObj.Finalize();
World.SendAll(AdMsgObj.MakePack());
AdMsgObj.Delete();
}
function PutOnEquip(SUser, equPlan, id) {
local charac_no = SUser.GetCID().tostring();
local InvenObj = SUser.GetInven();
if (!InvenObj) {
return;
}
// 遍历遍历穿戴栏0-21 时装栏 0-104 和 装备栏 3-56
for (local i = 0; i< 22; i++) {
if (equPlan[i].id) {
local type = i< 10 ? 2 : 1; // type 1装备 2时装
local startIndex = type == 2 ? 0 : 3; // 背包时装栏从0开始背包装备栏从3开始
local endIndex = type == 2 ? 105 : 57; //背包时装栏到104背包装备栏到56
for (local j = startIndex; j< endIndex; j++) {
local equOut = InvenObj.GetSlot(type, j);
local equId = equOut.GetIndex();
if (equPlan[i].id == equId && equPlan[i].lv == NativePointer(equOut.C_Object).add(7).readU32()) {
Sq_CallFunc(S_Ptr("0x0865EED2"), "int", ["pointer", "int", "int", "int"], SUser.C_Object, type == 2 ? 1 : 0, j, i);
break;
}
}
i = 0;
}
}
if (i) {
for (j = i; j< 3; j++) {
charArray3[j] = 0;
}
SUser.SendItemSpace(1);
SUser.SendItemSpace(0);
SUser.SendItemSpace(7);
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]];
}
SUser.SendNotiPacket(0, 2, 0);
SUser.SendNotiPacket(1, 2, 1);
SUser.SendNotiPacket(7, 2, 7);
while (i++<3) {
encoded += "=";
}
}
local Bq = Sq_CallFunc(S_Ptr("0x80DD584"), "pointer", ["pointer", "int"], SUser.C_Object, 2);
Sq_CallFunc(S_Ptr("0x85427A0"), "void", ["pointer", "pointer"], Bq, SUser.C_Object);
// RefreshTheLockOfEquipment(SUser, InvenObj);
// Sq_CallFunc(S_Ptr("0x84FAE0A"), "void", ["pointer", "int", "int", "int"], InvenObj.C_Object, NativePointer(InvenObj.C_Object).readInt(), 21, 0);
return encoded;
// 刷新装备栏锁头(不含穿戴栏暂无法刷新)
// Sq_CallFunc(S_Ptr("0x84FAF8E"), "void", ["pointer"], InvenObj.C_Object);
//// 刷新时装栏锁头(不含穿戴栏暂无法刷新)
//Sq_CallFunc(S_Ptr("0x084FAFBE"), "void", ["pointer"], InvenObj.C_Object);
// 刷新技能
Sq_CallFunc(S_Ptr("0x866C46A"), "void", ["pointer"], SUser.C_Object);
//// 刷新角色状态
//Sq_CallFunc(S_Ptr("0x867BA5C"), "int", ["pointer", "int", "int", "int"], SUser.C_Object, 0, 2, 0);
//Sq_CallFunc(S_Ptr("0x867BA5C"), "int", ["pointer", "int", "int", "int"], SUser.C_Object, 1, 2, 1);
user_equ_plan[charac_no].startTime <- time(); // 记录结束时间
SUser.SendNotiPacketMessage("装备方案[" + id + "]切换结束!!", 2);
}
Timer.SetTimeOut(function() {
local Key = "desaqe";
local Str = "Test Data";
print("old: " + Str);
local StrPointer = Memory.allocUtf8String(Str);
local BlobObj = StrPointer.readBinary(Str.len());
local Arr = xorEncryptDecrypt(BlobObj, Key);
StrPointer.writeByteArray(Arr);
//此时str已不可读 需要掌控其指针 与 长度
local NewStrPointer = StrPointer;
local encodestr = base64_encode(NewStrPointer.readUtf8String(Str.len()));
print("encode: " + encodestr);
function RefreshTheLockOfEquipment(SUser, InvenObj) {
local Pack = Packet();
//Clear
Sq_CallFunc(S_Ptr("0x80CB8E6"), "int", ["pointer"], Pack.C_Object);
Pack.Put_Header(0, 251);
//GetIndex
local Index = Sq_CallFunc(S_Ptr("0x8110B4C"), "int", ["pointer"], Pack.C_Object);
Pack.Put_Short(0);
local V7 = 0;
for (local i = 0; i< 21; i++) {
local Flag = NativePointer(InvenObj.C_Object).add((61 * i) + 48).readU8();
if (Flag) {
Pack.Put_Byte(0);
Pack.Put_Short(i);
Pack.Put_Byte(1);
Pack.Put_Int(500000);
// local Bq = Sq_CallFunc(S_Ptr("0x828B5DE"), "pointer", ["pointer", "int"], SUser.C_Object, 2);
// Sq_CallFunc(S_Ptr("0x828B5DE"), "char", ["pointer", "pointer"], Bq, Pack.C_Object);
V7++;
}
}
local Buf = Memory.alloc(4);
Buf.writeInt(Index);
Sq_CallFunc(S_Ptr("0x8110B28"), "int", ["pointer", "pointer", "int"], Pack.C_Object, Buf.C_Object, V7);
Pack.Finalize(1);
SUser.Send(Pack);
Pack.Delete();
print("发包了");
}
function api_PutOnEquip(SUser, id) {
local charac_no = SUser.GetCID().tostring();
if (!(charac_no in user_equ_plan)) {
SUser.SendNotiPacketMessage("方案不存在!!", 2);
return;
}
local equPlanKey = "equPlan" + id;
if (!user_equ_plan[charac_no].rawin(equPlanKey)) {
SUser.SendNotiPacketMessage("方案[" + id + "]不存在!!!", 2);
return;
}
local equPlan = user_equ_plan[charac_no][equPlanKey];
//换装指令冷却时间5scd
if (user_equ_plan[charac_no].rawin("startTime")) {
local currentTime = time();
local timeDiff = user_equ_plan[charac_no].startTime - currentTime + 5;
if (timeDiff > 0) {
SUser.SendNotiPacketMessage("换装功能冷却中,还有<" + timeDiff + ">秒才能使用!", 2);
return;
}
}
PutOnEquip(SUser, equPlan, id);
}
function MoveItem_send(SUser, type, slot, Bodyslot) {
local Pack = Packet();
Pack.Put_Header(1, 19);
Pack.Put_Byte(1); //默认1
Pack.Put_Byte(type); //协议, 0时装 1装备
Pack.Put_Short(slot); // 背包槽位slot
Pack.Put_Int(1); // 默认1未知
Pack.Put_Byte(3); // 默认3穿戴栏
Pack.Put_Short(Bodyslot); //穿戴栏slot(0-25)
Pack.Finalize(true);
SUser.Send(Pack);
local v6 = Sq_CallFunc(S_Ptr("0x081935A2"), "pointer", []);
Sq_CallFunc(S_Ptr("0x867BA5C"), "int", ["pointer", "pointer", "int", "int", "int", "int"], v6, SUser.C_Object, type, slot, 3, Bodyslot);
Pack.Delete();
}
function Save_equFnc(SUser, CmdString) {
local arr = split(CmdString, " ");
local id = arr[1].tointeger();
SaveEquipPlan(SUser, id);
}
// 注册命令1
Gm_InputFunc_Handle.rawset("pl", Save_equFnc);
function change_equFnc(SUser, CmdString) {
local arr = split(CmdString, " ");
local id = arr[1].tointeger();
api_PutOnEquip(SUser, id);
}
// 注册命令
Gm_InputFunc_Handle.rawset("on", change_equFnc);
local BlobObj = NewStrPointer.readBinary(Str.len());
local Arr = xorEncryptDecrypt(BlobObj, Key);
NewStrPointer.writeByteArray(Arr);
print("new: " + NewStrPointer.readUtf8String());
}, 1);
*/
//分割道具列表
@@ -583,13 +750,41 @@ Gm_InputFunc_Handle.TTT <- function(SUser, CmdString) {
// [3038, 200]
// ]);
SUser.DropItem(27095, 800, 200);
local InvenObj = SUser.GetInven();
for (local i = 0; i< 21; i++) {
local Flag = NativePointer(InvenObj.C_Object).add((61 * i) + 48).readU8();
print("i: " + i + " Flag: " + Flag);
}
// SUser.MainTaskCompleted();
};
// getroottable()._LenheartUserLoseEfficacyState_ <- Memory.alloc(577477);
// Memory.reset(getroottable()._LenheartUserLoseEfficacyState_,577477);
// Cb_SendMess_Enter_Func["Rindro"] <- function(args) {
// local PackCopyBuffer = Memory.alloc(10001);
// Memory.copy(PackCopyBuffer, NativePointer(args[2]), 1000);
// local Pack = Packet(PackCopyBuffer.C_Object);
// local Type = Pack.GetByte();
// if(Type == 1 || Type == 33){
// Pack.GetShort();
// Pack.GetInt();
// local StrLen = Pack.GetInt();
// local SStr = Pack.GetString(256,StrLen);
// local Str= SStr.readUtf8String();
// // print("对话长度:" + StrLen);
// print("对话:" + Str);
// if(Str.find("asd") != null){
// args[1] = getroottable()._LenheartUserLoseEfficacyState_.C_Object;
// print("屏蔽词");
// return args;
// }
// }
// }
@@ -671,15 +866,61 @@ ClientSocketPackFuncMap.rawset(21091001, function(SUser, Jso) {
// // SUser.SendNotiPacketMessage("出纳上到几点方柏霓撒娇扩大年级卡萨", 7);
// }
// //定义一个显示的变量
// getroottable().TaskCount <- 0;
// //任务
// function Task() {
// getroottable().TaskCount++;
// print("定时任务执行了一次,当前执行次数为:" + getroottable().TaskCount);
// }
// //注册一个定时任务 每五秒执行一次 任务名为 TestCronName
// Timer.SetCronTask(Task, {
// Cron = "0/5 * * * * *",
// Name = "TestCronName"
// });
function _Jump_DropItem_check_error_()
{
//如果没有创建过这个模拟内存就创建
if(!getroottable().rawin("_EmptyCharacInfo_Flag_")){
getroottable()._EmptyCharacInfo_Flag_ <- Memory.alloc(17);
Memory.reset(getroottable()._EmptyCharacInfo_Flag_,17);
}
//如果没有创建过这个跳转Flag就创建并初始化
if(!getroottable().rawin("_EmptyHook_Flag_")){
getroottable()._EmptyHook_Flag_ <- false;
}
}
Timer.SetTimeOut(function() {
// //私有方法 发送带参数的Post请求
// local SO = Http("129.211.27.104", "9080");
// local Res = SO.Post("/dof/chat", Json.Encode({
// username = "系统公告",
// text = "倾泪寒在格蓝迪发电站爆出了【雷剑-苦轮】!真是人品爆炸!!!",
// groupId = 850022626
// }), "application/json");
// Cb_DropItem_check_error_Enter_Func.Rindro <- function(args){
// getroottable()._EmptyHook_Flag_ = true;
// args[1] = getroottable()._EmptyCharacInfo_Flag_.C_Object;
// return args;
// }
// Cb_DropItem_check_error_Leave_Func.Rindro <- function(args){
// if(getroottable()._EmptyHook_Flag_){
// getroottable()._EmptyHook_Flag_ = false;
// return 19;
// }
// }
}, 1)
Gm_InputFunc_Handle["aaa"] <- function(SUser, cmd) {
// 获取角色背包
local InvenObj = SUser.GetInven();

View File

@@ -47,6 +47,7 @@ class Fiendwar {
//玩家发送消息HOOK 为了攻坚队频道和团长公告
function base_input_hook(CUser, CmdString) {
if (!CUser) return true;
local SUser = User(CUser);
//超时空频道
@@ -55,6 +56,7 @@ class Fiendwar {
if (Localtion.Area <= 1) {
return true;
} else {
print(111);
if (CmdString.find("RindroType") == 8) {
local Jso = {
op = 20063027,
@@ -73,6 +75,7 @@ class Fiendwar {
}
function base_input_hook2(args) {
local type = args[2];
local SUser = User(args[1]);
local msg = args[3];
@@ -95,6 +98,7 @@ class Fiendwar {
//玩家消息分发
function PlayerNotiMsgDistribute(Jso) {
local SUser = World.GetUserByUidCid(Jso.uid, Jso.cid);
if (!SUser) return;
local CUserList = Jso.list;
@@ -242,6 +246,7 @@ class Fiendwar {
Cb_Move_Area_Func.Fiendwar <- move_area_hook.bindenv(this); //区域移动
Base_InputHookFunc_Handle.Fiendwar <- base_input_hook.bindenv(this); //玩家发送消息
Cb_reach_game_world_Func.Fiendwar <- Login_Hook.bindenv(this); //上线HOOK
Cb_Server_Chat_Log_Leave_Func.Luke <- base_input_hook2.bindenv(this); //玩家发送消息
//注册收包
GatewaySocketPackFuncMap.rawset(20063010, FiendwarSendAreaUserCallBack.bindenv(this)); //玩家移动后的区域广播包

View File

@@ -324,7 +324,7 @@ _Hook_Register_Currency_Func_("0x086B330A", ["pointer", "pointer", "bool", "void
//刷新攻城怪物函数, 控制下一只刷新的攻城怪物id
Cb_CVillageMonsterArea_GetAttackedMonster_Enter_Func <- {};
Cb_CVillageMonsterArea_GetAttackedMonster_Leave_Func <- {};
_Hook_Register_Currency_Func_("0x086B3AEA", ["pointer", "int", "int"], Cb_CVillageMonsterArea_GetAttackedMonster_Enter_Func, Cb_CVillageMonsterArea_GetAttackedMonster_Leave_Func);
_Hook_Register_Currency_Func_("0x086B3AEA", ["pointer", "int", "pointer"], Cb_CVillageMonsterArea_GetAttackedMonster_Enter_Func, Cb_CVillageMonsterArea_GetAttackedMonster_Leave_Func);
//正在挑战的攻城怪物
Cb_CVillageMonster_OnFightVillageMonster_Enter_Func <- {};
@@ -448,11 +448,46 @@ _Hook_Register_Currency_Func_("0x08608D58", ["pointer", "int", "bool"], Cb_Check
//检查每日日程时间 提供者: 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);
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);
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);
Cb_CItem_IsRoutingItem_Enter_Func <- {};
Cb_CItem_IsRoutingItem_Leave_Func <- {};
_Hook_Register_Currency_Func_("0x08150f18", ["pointer", "int"], Cb_CItem_IsRoutingItem_Enter_Func, Cb_CItem_IsRoutingItem_Leave_Func);
//调整箱使用
Cb_ModItemattr_Enter_Func <- {};
Cb_ModItemattr_Leave_Func <- {};
_Hook_Register_Currency_Func_("0x8200B08", ["pointer", "pointer", "pointer", "int"], Cb_ModItemattr_Enter_Func, Cb_ModItemattr_Leave_Func);
//个人金库整理
Cb_CCargo_sort_Enter_Func <- {};
Cb_CCargo_sort_Leave_Func <- {};
_Hook_Register_Currency_Func_("0x850BD0C", ["pointer", "pointer"], Cb_CCargo_sort_Enter_Func, Cb_CCargo_sort_Leave_Func);
// 玩家断开链接时 提供者:南瓜
Cb_CUser_LogoutToPCRoom_Enter_Func <- {};
Cb_CUser_LogoutToPCRoom_Leave_Func <- {};
_Hook_Register_Currency_Func_("0x0868170C", ["pointer", "int"], Cb_CUser_LogoutToPCRoom_Enter_Func, Cb_CUser_LogoutToPCRoom_Leave_Func);
// 购买道具时的检查错误
Cb_BuyItem_check_error_Enter_Func <- {};
Cb_BuyItem_check_error_Leave_Func <- {};
_Hook_Register_Currency_Func_("0x081BE46A", ["pointer", "pointer", "pointer", "int"], Cb_BuyItem_check_error_Enter_Func, Cb_BuyItem_check_error_Leave_Func);
// 服务器被Kill时(不含炸频道等)
Cb_Server_ClossByKill_Enter_Func <- {};
Cb_Server_ClossByKill_Leave_Func <- {};
_Hook_Register_Currency_Func_("0x082FD90E", ["pointer", "int"], Cb_Server_ClossByKill_Enter_Func, Cb_Server_ClossByKill_Leave_Func);
// 收到玩家聊天信息
Cb_SendMess_Enter_Func <- {};
Cb_SendMess_Leave_Func <- {};
_Hook_Register_Currency_Func_("0x081F3540", ["pointer", "pointer","pointer","int"], Cb_SendMess_Enter_Func, Cb_SendMess_Leave_Func);

View File

@@ -40,6 +40,7 @@ function InitPluginInfo() {
//Log.Put("error", "测试错误日志");
GameManager.OpenCreateJob_CreatorMage();
GameManager.FixPracticemode();
// function IndependenceDropLogic(SUser, MonsterId, MonsterLevel, Xpos, Ypos, DgnName, DgnId, DgnLevel,DgnDiff, HellDiff)
@@ -88,7 +89,7 @@ function main() {
// Sq_Conversion("這是一個繁體字符串");
_Start_Official_Project_();
_Official_Project_();