- 经过目前实测,你可以使用 Visual Studio 2019 (v142平台工具集) 或者 Visual Studio 2022 (v143平台工具集) 来编译这个框架
- 默认情况下,项目使用 Visual Studio 2022 (v143平台工具集)
- 建议使用 x86 Release 方式构建框架
- 框架仅能完全适用于1.0.0.1051版本的游戏
- 程序从pvzclass.cpp的main函数开始运行,你可以直接在里面修改,编写你的程序,也可以用如下的格式构建
#include "pvzclass.h"
int main()
{
DWORD pid = ProcessOpener::Open();
if (pid) {
PVZ::InitPVZ(pid);
/*在这里编写你的代码*/
PVZ::QuitPVZ();
}
return 0;
}
- 不要忘记
PVZ::QuitPVZ()
关闭句柄
- 这是一个只有静态成员的类
- 它提供了获取游戏进程标识符的函数
- 你可以通过修改它的4个静态字段来修改默认的寻找参数
- 你可以手动调用指定函数来寻找游戏
- 默认
Open()
函数寻找的顺序是 进程名->窗口标题->文件路径 - 失败返回 0.
- 必须调用
PVZ::InitPVZ(pid)
后(参数是进程标识符),才可以使用PVZ
命名空间中的属性和方法:
PVZ::InitPVZ(pid);
PVZ::GetBoard()->Sun = 9990;//修改阳光
PVZ::GetBoard()->Win();//直接获胜
- 当已经调用
PVZ::InitPVZ(pid)
时,才可以使用PVZ类中的静态成员类,如Memory
int address = PVZ::Memory::AllocMemory();//申请内存空间
-
当调用
PVZ::QuitPVZ()
后,PVZ类中的静态成员类也无法使用。 -
PVZ::GetBoard()
是否返回空指针可以用于判断游戏当前是否在关卡内(空指针表示不在),绝大多数功能必须在关卡内部才可以使用。
- 这是一个只有静态成员的类
- 是命名空间
PVZ
下的类 - 它提供了对游戏内存的以下功能:
内存的读写
/*你可以使用任何数据类型去读写内存*/
int var = PVZ::Memory::ReadMemory<int>(0x750000);//读内存0x750000的一个整数值
PVZ::Memory::WriteMemory<int>(0x750000, 100);//写内存0x750000的为整数100
/*读写文本(数组)*/
char str1[50];
//STRING是一个宏,等价于str,sizeof(str)/sizeof(*str),后者的值会在编译期被计算出来
PVZ::Memory::ReadArray<char>(0x750000, STRING(str1));
char str2[50] = "这是用于测试的文本";
PVZ::Memory::WriteArray<char>(0x750000, STRING(str1));
/*读指针*/
int sun = PVZ::Memory::ReadPointer(0x6A9EC0, 0x768, 0x5560);
远程线程注入
byte asmcode[] = { RET };//RET是一个宏,等价于0xC3
PVZ::Memory::Execute(STRING(asmcode));
设置内存可完全访问
PVZ::Memory::AllAccess(0x750000);
内存申请与释放
int address = PVZ::Memory::AllocMemory();
PVZ::Memory::FreeMemory(address);
dll注入
PVZ::Memory::InjectDll("yourdll.dll");
- 静态字段
mainwindowhandle
是游戏的窗口句柄 immediateExecute
用于控制远程执行指令Execute
函数是否立即执行,否则会等到游戏运行到一个安全的地方再执行,以降低游戏崩溃的风险localExecute
用于控制远程执行指令是否在本线程执行而非远程线程,可以提高运行效率,需要与 DLL 注入等方式配合使用
- 是
PVZ.h
中的宏,对应std::shared_ptr
- 可以用于各种需要指针的场景
MKS
宏对应std::make_shared
,可用于构造SPT
- 是命名空间
PVZ
下的类 - 是其他类的基类
- 不要手动构造它们中的任何一个
- 以下类属于基础类:
- BaseClass
- Widget
- GameObject
- 是命名空间
PVZ
下的类 - 可以获取 pvzclass 的版本和游戏版本
- 需要实例化以使用其功能
- 是命名空间
PVZ
下的类 - 它的对象代表了游戏中的一个动画实体
- 它有2个静态方法
UnLock(int animprop)用于解锁属性,如不解锁,这些属性将是只读的
//AP_开头的宏表示动画属性,可以用"|"隔开
PVZ::Animation::UnLock(AP_PLANTCOLOR | AP_ZOMBIECOLOR);
Lock()用于重新锁定被解锁的属性
- 可以通过其他对象的
GetAnimation()
方法取得对应的动画对象 - 可以手动获取整个游戏中的第 n 个对象
SPT<PVZ::Animation> anim = MKS<PVZ::Animation>(0);//获得第1个对象
-
是命名空间
PVZ
下的类 -
需要用
PVZ::GetXXX
的方式获得,不要手动new- 部分
GetXXX
是Board
类的成员函数,需要先GetBoard()
后才能获取
- 部分
-
以下类属于唯一指定的,通常起控制作用:
- PVZApp
- Board
- SeedChooserScreen
- Lawn
- Icetrace
- Wave(需要参数指定是当前关卡的第几波)
- Mouse
- MousePointer
- Caption
- CardSlot
- Miscellaneous
- SaveData
- Music
- PlantDefinition(需要参数指定是哪种植物)
- ZombieDefinition(需要参数指定是哪种僵尸)
- ProjectileDefinition(需要参数指定是哪种子弹)
- ChallengeDefinition(需要参数指定是哪一个模式)
- ChallengeScreen
- 是命名空间
PVZ
下的类 - 需要手动获取整个游戏中的第 n 个对象,方法同
Animation
类 - 部分类可以用
PVZ::GetBoard()->GetAllXXX
的方式一次获得当前全部可用的对象
std::vector<SPT<PVZ::Zombie>> zombies = PVZ::GetBoard()->GetAllZombies();
- 以下类属于游戏内的对象实体类:
- Zombie
- Projectile
- Plant
- Coin
- Lawnmover
- Griditem(Grave, Crater, AquariumBrain, Snail, Vase, IZBrain, Portal 类的基类)
- Attachment
- TrackInstance
- 是
CardSlot
类的成员类 - 需要用上一级类的对象的
->GetXXX
的方式获得 - 可以手动获取整个游戏中的第 n 个对象,方法同 Animation 类
- 一个单独的类,SaveData 类和 Coin 类都有实现它的成员(或成员函数)
- 需要用上一级类的对象的
->GetXXX
的方式获得 - 不要手动构造它
- 每一种枚举类型都在其各自的名称空间里
- 几乎每一种枚举类型的名称空间里都有
ToString
方法,可以将枚举类型转化为字符串
- 默认在
pvzclass.h
中被包含 - 不是必须的
- 提供了几个常用的修改功能
- 参数是代表开启还是关闭功能
-
Creator
是一个名称空间 -
声明和定义默认在
pvzclass.h
中被包含 -
提供了在游戏中创建实体的函数
-
AsmInit
函数是部分方法的初始化函数,只需要调用一次- 程序结束时,若调用过
AsmInit
,请务必再调用一次AsmReset
- 程序结束时,若调用过
-
以下函数需要必须要初始化才能使用:
- 重载函数
CreateProjectile(ProjectileType::ProjectileType,int,int,float,float)
__CreatePortal
CreatePortal
FrozeAll
函数需要在关卡出现过植物的情况下才有效果
Cosnt
是一个名称空间- 提供了查询、修改部分常量的函数
- 默认不在
pvzclass.h
中被包含,请手动#include
- 全面更新过的事件组件
- 详情请查阅这篇文档。
可以参考某个模块更新时相同 commit 中的 pvzclass.cpp 和 pch.cpp。