DP-S-Script/Dps_A/BaseClass/GameManagerClass/GameManagerClass.nut

339 lines
13 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
文件名:GameManagerClass.nut
路径:BaseClass/GameManagerClass/GameManagerClass.nut
创建日期:2024-04-09 20:30
文件用途:游戏管理器类
*/
class GameManager extends Base_C_Object {
constructor() {
local CObject = Sq_GameManager_GameManager();
base.constructor(CObject);
}
function GetParty() {
local C_Party = Sq_GameManager_GetParty(C_Object);
return Party(C_Party);
}
//设置游戏最大等级
function SetGameMaxLevel(MaxLevel) {
NativePointer("0x8360C38").add(3).writeU8(MaxLevel);
NativePointer("0x8360C76").add(3).writeU8(MaxLevel);
NativePointer("0x8360CC1").add(3).writeU8(MaxLevel);
NativePointer("0x84EF802").add(3).writeU8(MaxLevel);
NativePointer("0x858F002").add(3).writeU8(MaxLevel);
NativePointer("0x865A5C0").add(1).writeU8(MaxLevel);
NativePointer("0x865B091").add(4).writeU8(MaxLevel);
NativePointer("0x865B757").add(4).writeU8(MaxLevel);
NativePointer("0x8662F53").add(2).writeU8(MaxLevel);
NativePointer("0x86630F0").add(3).writeU8(MaxLevel);
NativePointer("0x86638F4").add(2).writeU8(MaxLevel);
NativePointer("0x8665D24").add(4).writeU8(MaxLevel);
NativePointer("0x8666E9A").add(2).writeU8(MaxLevel);
NativePointer("0x866A4A6").add(2).writeU8(MaxLevel);
NativePointer("0x866A657").add(2).writeU8(MaxLevel);
NativePointer("0x866A926").add(3).writeU8(MaxLevel);
NativePointer("0x866A93F").add(2).writeU8(MaxLevel);
NativePointer("0x867AEC0").add(2).writeU8(MaxLevel);
NativePointer("0x8689D48").add(3).writeU8(MaxLevel);
NativePointer("0x868fecb").add(3).writeU8(MaxLevel);
NativePointer("0x868fed4").add(6).writeU8(MaxLevel);
}
//设置装备解锁需要时间
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);
}
}
}
//开启创建鼠标妹
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 || !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") {
if (getroottable()._HotFixPath_.rawin(Path)) return;
print("DP-S开启自动重载脚本功能,重载目录为: " + Path + " .");
print("请注意如果你不处于DP-S开发环境请关闭此功能以免对性能造成影响");
Sq_AutoReload(Path);
getroottable()._HotFixPath_.rawset(Path, true);
}
//开启时装镶嵌
function FixAvatarUseJewel() {
//时装镶嵌修复
_AvatarUseJewel_Object <- AvatarUseJewel();
}
//开启装备镶嵌
function FixEquipUseJewel() {
//装备镶嵌修复
_EquimentUseJewel_Object <- EquimentUseJewel();
}
//修复14技能
function Fix14Skill() {
Sq_WriteByteArr(S_Ptr("0x08604B1E"), [0x83, 0x7D, 0xEC, 0x07]);
Sq_WriteByteArr(S_Ptr("0x08604B8C"), [0xC7, 0x45, 0xE4, 0x08, 0x00, 0x00, 0x00]);
Sq_WriteByteArr(S_Ptr("0x08604A09"), [0x83, 0x7D, 0x0C, 0x07]);
Sq_WriteByteArr(S_Ptr("0x086050b1"), [0xC7, 0x45, 0xEC, 0x08, 0x00, 0x00, 0x00]);
Sq_WriteByteArr(S_Ptr("0x0860511c"), [0xC7, 0x45, 0xE8, 0x08, 0x00, 0x00, 0x00]);
Sq_WriteByteArr(S_Ptr("0x08608D7B"), [0x83, 0xF8, 0x0B]);
}
//修复下线卡城镇
function FixSaveTown() {
Cb_Set_Charac_Info_Detail_Enter_Func._FixSaveTown_ <- function(arg) {
local curArea = NativePointer(arg[3]).add(34).readS8();
if (curArea == 12 || curArea == 13) {
NativePointer(arg[3]).add(34).writeS8(11);
}
}
}
//修复绝望金币异常
function FixDespairGold() {
getroottable()._FixDespairGold_Data_ <- {};
Cb_UseAncientDungeonItems_Enter_Func._FixDespairGold_ <- function(arg) {
local DgnObj = Dungeon(arg[1]);
local DgnIndex = DgnObj.GetId();
if ((DgnIndex >= 11008) && (DgnIndex <= 11107)) {
getroottable()._FixDespairGold_Data_[arg[1]] <- NativePointer(arg[1]).add(2044).readS8();
NativePointer(arg[1]).add(2044).writeS8(0);
}
}
Cb_UseAncientDungeonItems_Leave_Func._FixDespairGold_ <- function(arg) {
local DgnObj = Dungeon(arg[1]);
local DgnIndex = DgnObj.GetId();
if ((DgnIndex >= 11008) && (DgnIndex <= 11107)) {
//绝望之塔 不再扣除金币
NativePointer(arg[1]).add(2044).writeS8(getroottable()._FixDespairGold_Data_[arg[1]]);
getroottable()._FixDespairGold_Data_.rawdelete(arg[1]);
}
}
}
//修复绝望之塔通关后可以用门票继续进入
function FixDespairDungeon() {
Cb_User_CheckDailyScheduleTime_Leave_Func.DailyScheduleTime <- function(args) {
return true;
};
Cb_User_TOD_UserState_getLastClearTime_Leave_Func.DailyScheduleTime <- function(args) {
return 0;
};
}
//修改交易金币上限
function FixGlodTradeDaily(Count) {
local Arr = [0xB8];
local BlobObj = blob(0);
BlobObj.writen(Count, 'i');
for (local i = 0; i< 4; i++) {
Arr.append(BlobObj[i]);
}
Arr.append(0x90);
Sq_WriteByteArr(S_Ptr("0x86464CE"), Arr);
}
//+13免刷新
function Fix_13Upgrade() {
Haker.LoadHook("0x080FC850", ["pointer", "pointer", "pointer", "int", "void"],
function(args) {
return null;
},
function(args) {
local Pos = NativePointer(args[2]).add(27).readU16();
local SUser = User(args[1]);
SUser.SendUpdateItemList(1, 0, Pos);
return null;
});
}
//副本可丢弃品级 传入一个值 3为神器
function FixDungeonDropGrade(Level) {
NativePointer("0x085A69F2").writeS8(Level);
}
//邮件去除验证
function FixEmailRemovalVerification() {
local HexCode = Haker.AsmGenerateMcd(
"mov eax, 0x0",
"ret");
Sq_WriteByteArr(S_Ptr("0x0868A51A"), HexCode);
}
//修复拍卖行消耗品上架,设置最大总价,建议值2E
function Fix_Auction_Regist_Item() {
Haker.LoadHook("0x08213E40", ["int", "int", "bool"],
function(args) {
return null;
},
function(args) {
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;
}
}