发布一个专用游戏修改器的通用框架

来源:互联网 发布:万方外文文献数据库 编辑:程序博客网 时间:2024/05/15 00:28

最初的想法是写一个狮心王的修改器,但是后来想想,已经写了很多修改器了,每次都在改那些代码,麻烦的很,于是就转写了这个框架,把要修改的游戏的信息保存在配置文件当中。当初想用INI或者其他形式文件来保存,后来想想还是自定义一个格式比较锻炼想法,于是就出现了现在修改器里的配置文件.SOR

关于修改部分的核心已经公布过很多次了,这里只说一说工作核心和配置文件实现的核心:

一、工作核心

1、将所有DATA文件夹下的文件夹读回,并将其中的.SOR文件保存在内存中

2、启动回调SetTimer Me.hwnd, 0, 1, AddressOf TimerProc从而激活GetPressedKey函数,使主窗体内labKeyState_Change生效,也就是将labKeyState的事件Change循环调用,所有功能都在这里实现。

3labKeyState_Change事件发生时,若有按键传入且系统内可见窗口中有标题与类和某个.SOR文件内数据相同的,则检查按键是否一致,若一致则进行修改、恢复等操作

以上就是整个实现过程了。

二、配置文件实现

1、结构(即.SOR文件结构定义)

Private Type ByteFile

    WindowName(511) As Byte          保存游戏窗口名

    ClassName(511) As Byte              保存游戏窗口类名

    FunctionName(1023) As Byte       保存该数据文件实现的功能名

    HookKey As Byte                        保存启动该修改的热键扫描码

    LookEdit As Byte                        保留

    CodeArray(3) As Byte                 保存修改的内存地址

    CodeLen As Byte                         保存修改内存地址的长度

    Code(1023) As Byte                    保存要在内存地址内写入的内容

End Type

2、关于该结构的保存和读取

其实很简单,因为一致的Byte声明,我们直接这样:

Public Sub wFile(ByRef ByteFileType As ByteFile, ByVal ByteFilePathName As String)

 

Open ByteFilePathName For Binary As #1

    Put #1, , ByteFileType

Close #1

 

End Sub

 

Public Sub rFile(ByRef ByteFileType As ByteFile, ByVal ByteFilePathName As String)

 

Open ByteFilePathName For Binary As #1

    Get #1, , ByteFileType

Close #1

 

End Sub

3、关于用字节保存字符串

首先说一下网上的一个代码:

CopyMemory快速交换字符串的代码:

Option explicit

private sub copymemory lib "kernel32" Alias "RtlMoveMemory"(byval Dest as long,byval Source as long,byval Len as long)

sub Main()

    dim StrA as string

    dim StrB as string

    dim P as long

    StrA="abcd"

    StrB="efghjik"

    copymemory(varptr(p),varptr(StrA),4)

    copymemory(varptr(StrA),varptr(StrB),4)

    copymemory(varptr(StrB),varptr(p),4)

end sub

在用以下声明时未通过:

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

首先代码有明显错误:CopyMemory函数后面的括号。。。如果用我常用的这个声明,可以修改如下:

Option explicit

private sub copymemory lib "kernel32" Alias "RtlMoveMemory"(byval Dest as long,byval Source as long,byval Len as long)

sub Main()

    dim StrA as string

    dim StrB as string

    dim P() as byte      这里,实际上可以声明为其他类型,我只是指出可以用BYTE来保存

    StrA="abcd"

    StrB="efghjik"

    Copymemory byval varptr(p(0)),byval varptr(StrA),4

    Copymemory byval varptr(StrA),byval varptr(StrB),4

    Copymemory byval varptr(StrB),byval varptr(p(0)),4

end sub

可能大家看了以为我的代码里也是如此实现的,实际上不是,以上的方法是初始化了STRASTRB,如果没有初始化时,这个代码无法生效的。至少我实验了一些办法,非法了N多次也没弄出来个解决办法。我的代码里是利用了UTF-8编码转换函数是在BYTE数组和字符串之间变化的特性实现的:

需要的声明如下(由于函数非原创,所以不贴了,坛子里有)

Private Declare Function WideCharToMultiByte Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long, ByRef lpMultiByteStr As Any, ByVal cchMultiByte As Long, ByVal lpDefaultChar As String, ByVal lpUsedDefaultChar As Long) As Long

Private Declare Function MultiByteToWideChar Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpMultiByteStr As Long, ByVal cchMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long

Private Const CP_UTF8 = 65001

由于结构中是固定的,所以将字符串转化为BYTE时需要一个转换,我是这样实现的:

mStrBuff = UTF8_Encode(txtGameWindText.Text)

CopyMemory ByVal VarPtr(ByteFileType.WindowName(0)), ByVal VarPtr(mStrBuff(0)), 512

 

好了,就写这些吧,这个程序随狮心王修改器一起发布的。

下载地址:

http://download.csdn.net/user/zcsor

以后发布游戏修改器都使用这个框架了,不更新本程序时只发布相应的数据文件,只需要解压缩到程序目录下的DATA目录中即可。

 

 

关于以上的结构的一点说明.....实际上,我定义了

    CodeLen As Byte
    Code(1017) As Byte

可以看出,如果使用CodeLen那么代码长度最多为256个字节,后面的都浪费了,作为存储确实是这样,但是在开发主程序时我也使用了类似结构,长度是相同的,而其他的一些定义则利用了这个空闲空间.现在的结构形式如下:

Private Type ByteFile
    WindowName(511) As Byte
    ClassName(511) As Byte
    FunctionName(1023) As Byte
    HookKey As Byte
    LookEdit As Byte
    CodeArray(3) As Byte
    CodeLen As Byte
    Code(1017) As Byte
    ThenEditOver As Byte
    ThenDataBlck As Byte
    ThenGamePid(3) As Byte
End Type

当以后要实现更多功能的时候,很容易扩充,呵呵,,当时定义时没有明确把这个部分留出来.....

原创粉丝点击