|
很久没来预约社区了,当初开发炫舞挂,认识了预约。
玩了很久的炫舞辅助,感觉玩腻了,苦苦的等待,盼来了侠盗猎车手5(GTA5)。
刚开始学习炫舞挂制作,学会了易语言,慢慢开始学习C++。
好吧~我来跟大家一起来学习VC2013 VC2015 X64位,如何编写GTA5修改器
先给大家看看修改器的界面截图
以上是我写好的修改器截图,目前国内最厉害的几个GTA5辅助是(GTA5KevinMenu)(GTA5上帝辅助),
这里我们说的是原创修改器,对于那些汉化国外的垃圾挂,我就不说了,汉化不完整什么的大把。
第一篇帖子权当基础教程,我并非是c++高手,只是趋于爱好,逐渐学习,学学忘忘。【不足之处还望指正,学习就是摸索、研究、请教】
1、什么是Asi
Asi是Script Hook V的脚本文件,与其说是脚本,我认为不如说是DLL文件更为恰当,用Editplus类软件编辑Asi文件时,都能看到文件头的标准win32结构,Script Hook从字面了解,就能明白,通过hook(例如我给你打电话,中间需要一个基站,hook你可以看作一个伪造的基站,拦截正规基站的信息,然后对其发出修改后的指令,然后得到结果,外挂常用的一种形式)创建我们需要功能,让Script Hook来识别,并在游戏内体现出来。而Asi的书写结构是标准的c++结构,所以说大家还是学c++吧,哈哈。
2、如何编译Asi
安装VS2013,打开 Source\samples\NativeTrainer.sln 工程文件,然后如图所示,下方会有简要提示,无论是否编译成功。
3、关于中文编译
采用中文需要注意事项,首先编码必须是utf8,然后字符集必须采用"使用 Unicode 字符集", 因为编码的问题(这是我的猜测,我在很早以前看到过GTA系列是单字节游戏,汉化也是采取的外挂形式,在实际测试过程中,乱码问题,建议全部采取繁体中文书写,如果编译出现错误C2001,偶数中文背后加上英文符,或gbk to utf8字符转换)
4、代码基础讲解
因为代码都是标准的C++结构,所以这里不对最基础的指令进行说明,只对针对游戏有作用的代码进行说明。首先来看一段代码,代码内能备注的,我都进行备注
创建菜单函数,创建菜单的方式有许多种,这里只以其中之一进行说明,该函数涵盖本附件源码内的基础功能
首先看创建菜单的一个功能
- draw_menu_line(caption, 350.0, 15.0, 18.0, 0.0, 5.0, false, true);
[color=rgb(51, 102, 153) !important]复制代码
后面一堆参数怎么知道表达的是什么意思?你可以在vs中搜索draw_menu_line后会出现下方的代码,相对应后你就知道都是什么意思了,或者直接在vs中自己手动键入draw_menu_line他也会提示,那么翻译出现就是
- //draw_menu_line(文本,宽度,高度,顶位置,左边位置,文本位置,是否可选中,是否为标题,自动调整文本(不指定则为true))
[color=rgb(51, 102, 153) !important]复制代码
那么我们继续看下面的一段代码
- void draw_menu_line(std::string caption, float lineWidth, float lineHeight, float lineTop, float lineLeft, float textLeft, bool active, bool title, bool rescaleText = true)
- {
- // default values
- int text_col[4] = {255, 255, 255, 255}, //初始值定义 字体颜色及矩形背景颜色 颜色代码请自己google
- rect_col[4] = { 0, 0, 0, 140 }; //rect_col[4] = {70, 95, 95, 255};
- float text_scale = 0.35; //字体比例 0.1最小
- int font = 0;
- // correcting values for active line
- if (active)
- {
- text_col[0] = 243;
- text_col[1] = 23;
- text_col[2] = 84;
- rect_col[0] = 0;
- rect_col[1] = 0;
- rect_col[2] = 0;
- rect_col[3] = 140;
- if (rescaleText) text_scale = 0.40;
- }
- if (title) //如果title=true
- {
- rect_col[0] = 243;
- rect_col[1] = 23;
- rect_col[2] = 84;
- rect_col[3] = 140;
- if (rescaleText) text_scale = 0.50;
- font = 1;
- }
- int screen_w, screen_h;
- GRAPHICS::GET_SCREEN_RESOLUTION(&screen_w, &screen_h);
- textLeft += lineLeft;
- float lineWidthScaled = lineWidth / (float)screen_w; // line width
- float lineTopScaled = lineTop / (float)screen_h; // line top offset
- float textLeftScaled = textLeft / (float)screen_w; // text left offset
- float lineHeightScaled = lineHeight / (float)screen_h; // line height
- float lineLeftScaled = lineLeft / (float)screen_w;
- UI::SET_TEXT_FONT(font); //定义字体
- UI::SET_TEXT_SCALE(0.0, text_scale); //定义比例
- UI::SET_TEXT_COLOUR(text_col[0], text_col[1], text_col[2], text_col[3]); //定义字体颜色
- UI::SET_TEXT_CENTRE(0); //定义中心,这里我也没有搞清楚是什么作用
- UI::SET_TEXT_DROPSHADOW(0, 0, 0, 0, 0); //定义字体阴影颜色?
- UI::SET_TEXT_EDGE(0, 0, 0, 0, 0); //定义字体边缘颜色?
- UI::_SET_TEXT_ENTRY("STRING"); //定义输出类型 String 字符串
- UI::_ADD_TEXT_COMPONENT_STRING((LPSTR)caption.c_str()); //调用组建,不用去理解,算是一个接口
- UI::_DRAW_TEXT(textLeftScaled, (((lineTopScaled + 0.00278f) + lineHeightScaled) - 0.005f));
- UI::SET_TEXT_FONT(font);
- UI::SET_TEXT_SCALE(0.0, text_scale);
- UI::SET_TEXT_COLOUR(text_col[0], text_col[1], text_col[2], text_col[3]);
- UI::SET_TEXT_CENTRE(0);
- UI::SET_TEXT_DROPSHADOW(0, 0, 0, 0, 0);
- UI::SET_TEXT_EDGE(0, 0, 0, 0, 0);
- UI::_0x521FB041D93DD0E4("STRING");
- UI::_ADD_TEXT_COMPONENT_STRING((LPSTR)caption.c_str());
- int num25 = UI::_0x9040DFB09BE75706(textLeftScaled, (((lineTopScaled + 0.00278f) + lineHeightScaled) - 0.005f));
- draw_rect(lineLeftScaled, lineTopScaled + (0.00278f),
- lineWidthScaled, ((((float)(num25)* UI::_0xDB88A37483346780(text_scale, 0)) + (lineHeightScaled * 2.0f)) + 0.005f),
- rect_col[0], rect_col[1], rect_col[2], rect_col[3]);
- }
[color=rgb(51, 102, 153) !important]复制代码
上面部分完了,只是起个抛砖引玉的作用,很多不明白的参数,可以按照我提供的方法,找到函数入口,查看对于的参数,来知道其中的意思。
那么接着继续,上面说到创建菜单,其中有部分SDK参数,但是我们在代码中还发现了一个奇怪的部分,为什么要搞那么多次?其实我们按照逻辑分析一下,创建菜单的函数为draw_menu_line,创建输出文字又是另外一个函数,一个的目的很单纯,一个则是创建菜单,细看两段代码,都是很多不同之处,从这里可以思考到一个问题,那么以后我们在单独制作其他的插件的时候是否也应该考虑到这个问题了?我们改变其中的参数有会得到具体的什么表现了?不如自己尝试修改后实下。
- void update_status_text()
- {
- if (GetTickCount() < statusTextDrawTicksMax)
- {
- UI::SET_TEXT_FONT(0);
- UI::SET_TEXT_SCALE(0.55, 0.55);
- UI::SET_TEXT_COLOUR(243, 23, 84, 255);
- UI::SET_TEXT_WRAP(0.0, 1.0);
- UI::SET_TEXT_CENTRE(0);
- UI::SET_TEXT_DROPSHADOW(0, 0, 0, 0, 0);
- UI::SET_TEXT_EDGE(1, 0, 0, 0, 205);
- if (statusTextGxtEntry)
- {
- UI::_SET_TEXT_ENTRY((char *)statusText.c_str());
- } else
- {
- UI::_SET_TEXT_ENTRY("STRING");
- UI::_ADD_TEXT_COMPONENT_STRING((char *)statusText.c_str());
- }
- UI::_DRAW_TEXT(0.5, 0.5);
- }
- }
很多文字写不了,下次再写了
今天就讲到这里,感兴趣可以下载 我制作的测试,绿色分享 链接:http://share.weiyun.com/bb7d6ca33b59467db28ef97f5ec074a5 (密码:eVFl)
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
评分
-
查看全部评分
|