[ESA]永恒的星际联盟

 找回密码
 立即注册

!connect_header_login!

!connect_header_login_tip!

查看: 1177|回复: 12

重制版EUD高级制图教程

[复制链接]
发表于 2020-2-25 11:52:02 | 显示全部楼层 |阅读模式
本帖最后由 sc_forever 于 2020-3-16 14:17 编辑

前言:本人认为,重制版的EUD图也可以做的十分精彩,虽然不能完全做的像1.08那样,但是实现大部分功能还是可以的。在韩国那边单单重制版的EUD技术就已经研究的很深了,包括聊天检测,按钮触发,操作某个单位等技术。本教程面面向的人群是已经用EUD技术完全独立制作过一个完整地图,并且还想继续学习EUd更高级的技术。要是不懂EUD且对EUD技术感兴趣的话,可以先学习尘缘根号三的制图教程,教学视频汇总贴http://www.kahuuchino.com/2019/09/13/941/也可以加入我们的群:616210442。群里有很多大佬目前正在研究重制版的EUD技术,现在已经有一定的成果了。那么本教程将会教大家很常用的高级技术,具体如下:
1.了解重制版的内存表 (这是后面所有技术的基础),了解Cunit的概念(cunit是操作某个单位要掌握的知识)
2.对鼠标选取的某个单位进行任意操作(包括回血回蓝,加速减速各种命令)
3.按钮触发
4.地图自带加速
5.单位释放技能的特效添加6.对地图上的某个单位进行任意操作(只要是Cunit表里有的)
掌握以上教程,需要一定的计算机知识储备(如不掌握以下知识,可能不能理解本课程,请自行查阅资料):
1.对计算机内存的了解,了解基地址,偏移地址的概念。
2.对十六进制和十进制之间的转化了解,了解十六进制加减法
3.掌握字节的概念,了解字节可以存储的信息位数。
***4.对c语言中指针概念的初步理解
***5.对数据结构链表有一定的认识
注:***超纲内容,可理解可不理解。
本教程是重制版Eud高级技术教程,不能直接用到1.08上
本教程是重制版Eud高级技术教程,不能直接用到1.08上
本教程是重制版Eud高级技术教程,不能直接用到1.08上

之后有时间再更新吧,要是看的人多就更新快点。



点评

xkl
看不懂,但很不错,我不敢插楼  发表于 2020-3-3 14:50
 楼主| 发表于 2020-3-16 19:08:45 | 显示全部楼层
本帖最后由 sc_forever 于 2020-3-17 14:20 编辑

第三章:按钮触发


既然版主大人都来了,那我今天更新一下吧。今天讲的是按钮触发,就是点击一个按钮然后可以执行你写的触发。前面的教程看不懂的话很正常,但这章一定能看懂了,而且按钮触发非常的实用。用按钮触发可以实现非常多的事情,比如说自定义技能,比如回城之类的。看懂这章,你需要会改按钮,SMC或者EUDEditoe2的按钮触发会改就行。那么不废话,开始讲解吧。

首先讲下原理,当我们按下一个按钮的时候,编辑器是不知道我们按下按钮的,需要一个事件来检测到按钮按下。理论上有非常多事件可以检测到按钮按下(比如按下按钮升级)但这些实际过程中是不起作用的(起码我没有成功)。这里讲下可以成功实现的方法:比如红球身上有一个按钮可以生产单位,当红球按下这个按钮的时候,触发器就可以成功检测到单位生产,就可以执行触发了

这里以红球作为例子,我们让红球生产一个Zealot,这里有一个技巧,我们可以直接到神族兵营里复制生产XX兵的按钮,然后粘到红球身上。像这样

EUD_Editor_f6L3eb3YMX.png

EUD_Editor_f6L3eb3YMX.png

B1w75hMo7k.png


第三张图的位置可以放在不冲突的位置,我是放到了6号位置.

同时,别忘了改需求以及生产Zealot需要的金币和人口。如下图:

如何改需求可以看最后一张图,排版已经乱了!!

fXagCoAZEo.png

修改了人口要求和要求的金币后,点击按钮就不会受到这些限制了。需求可以改成Always,但建议会改的用Custom改。


好了,以上是前置的工作,现在要写触发检测单位生产了,我们进入触发编辑器界面。

w9OuxChv6C.png

点击FuncLoad,这里面有非常丰富的内置函数,都是作者写的。(可以熟悉下,这些函数可以实现非常多的功能,也可以自己写函数)。

我们勾上BuildCheck和BuildRest函数,这两个函数一个是检测单位生产,另一个把这个生产的单位取消掉(因为只有建筑能生产单位,普通单位不能单独通过按钮生产单位

XecbSJMlul.png

Hcxh2OECHA.png

好了,下一步,我们建立一个触发,在条件里点击Func,把BuildCheck选上。我们看到有两个参数,第一个是UnitPTR,中文叫单位内存地址.第二个是检测生产的单位,我们是生产Zealot这里就选Zealot。

eA2buSC4Bl.png

K9ntHyknbt.png

那么单位内存地址怎么获取呢,我们先创建一个变量,把P勾上(这个P代表长度为8的数组,也就是每个玩家都可以有这个变量存储单位的内存地址)。

起名随便取,我这里叫Hero。


0nWmr4p5up.png

ZoJuhSQShI.png

下一步,我们让一个玩家创建红球,并用这个变量存储红球的内存地址,条件可以填Always.

vD70gdkBnH.png

pvkOQEOsom.png

这里解释一下,SetnextUnitPtr指向了我们下一个创造的单位,之后我们创造了一个红球(红球是作为例子,其他单位也可以照着做).于是Hero里保存了我们刚创造的单位的内存地址,也就是红球,

注意事项:1.Hero[getcurpl()]是把创造的单位存到当前玩家的数组里,没学过编程不是很好理解,没关系,可以直接用.每个玩家创造英雄单位都这么照着写.

2.SetNextUnitPTR的位置一定要在创建单位的上面,建议SetNextUnitPTR之后马上创建单位!!!

3.创造红球的时间段内一定不要同时创造其他单位,不然可能变量里保存其他单位的内存地址!!

现在已经获取了单位的内存地址,回到刚刚那条触发,UnitPTR填Hero[getcurpl()](注意,哪个玩家执行了创造单位的触发,就让哪个玩家执行这条触发,不然不起作用!!)

在这个条件里加个条件,当前变量不为0(不然地图可能会报不支持此EUD图,是因为修改了非法的内存!!)如下图:

这里一定要注意的是,检测变量为0的条件一定要放在最上方,如果让BuildCheck的函数先执行了,也可能报不支持地图的错误,这是因为触发的条件与动作执行都是从上到下的!!

4hGHa2xO6f.png

8ev8rgMYC5.png

然后写动作(Action),第一条最好写buildReset!!!!不然可能出错。EUDTurbo同时也要选上,这是为了能及时检测到按钮按下!!


bc1u466L8u.png


把Function前面的勾打上,然后结束了,其他动作随意发挥吧。。。。比如在英雄当前位置创造单位,触发能做的事情都可以。。这就是按钮触发。。

梳理一下原理吧,我们条件是红球按下了按钮,然后函数检测到创造了xx兵,动作把用红球创造的Zealot取消掉。。

然后,我们可以做出很酷炫的技能,比如回城。。。自定义技能。。。


sp1.gif

sp2.gif


至于如何做出特效。。。在后面的章节会进行讲解

后面的图不要看。。。图错的。。。,排版乱了。。不知道怎么改回来

TnjNOqnn4h.png
lLH699gMo9.png
sZyxOWOkkx.png
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-2-26 12:48:29 | 显示全部楼层
本帖最后由 sc_forever 于 2020-3-6 10:28 编辑


第一章:重制版内存表,以及CUnit



  今天有空,先更新第一章吧。先带大家看下重制版的内存表,重制版的内存表需要用Google搜索EUDDB才能看到,没有梯子的同学我已经把网页压缩成Rar上传了。简单介绍下内存表的东西吧,Address这一栏表示的是16进制的地址,即这块内存的起始地址。像第一栏Filename for Lastreplay的地址004FF900也可以表示为0x004FF900,这个0x就是代表16进制的意思,第二栏暂时不讲,第三四栏和最后一栏看名字就知道意思了。讲下Size和Length的意思,一个内存地址可能分成很多块,每块都可能存储不同的信息,这个块的大小为就是Size,块的数量就是Length(注意都是以字节为单位的)。

p1.png

可能这么解释有点抽象,那举个例子吧。我们看下死亡表在内存中的位置,EUD的全名叫做Extended Unit Deaths,对没错,这个Unit Deaths就是指内存中这个的死亡表。我们知道编辑地图的时候可以用Setdeath来编辑死亡数,而星际争霸这个游戏对这个死亡数的范围没有进行限制,于是我们就可以越过死亡表在内存中的地址,去修改别的东西,这个就是EUD的由来。重制版为什么照样可以有EUD图,是因为暴雪部分支持EUD技术,没有修复这个漏洞,所以我们照样可以越过死亡表修改内存我们点击死亡表前面的地址,进去看看信息。(没有梯子这个页面应该打不开,看我这个就可以了
2.png

点开之后我们看到了很多东西。就解释下Size和Length吧,看他的描述可以知道,星际中需要对12个玩家的死亡数进行存储,而每个玩家又要分别对每个地图上可摆放的单位的死亡数进行存储(Start location和雷达之类不可死亡的单位也进行存储,于2020.3.6日进行修订),每个玩家可以存储的每个单位的死亡量是U32个(U32是无符号32位整数,可以理解为需要4个字节存储,十进制的的大小为0到2^32-1)。size就是一个块的大小,每个单位死亡数四个字节存储,又有12个玩家,Size=4字节x12。Length228为块的数量,228代表这星际中可死亡的单位数量为228个.于是死亡表在内存中占的空间为48字节x228个=10944个字节=0x2AC0(十进制十六进制转换学会了吗)。我们用死亡表之后内存的起始地址(SC Technologies Available (0-23)),0058CE24减去0058A364(十六进制减法)即0x0058CE24-0x0058A364=0x2AC0。和我们之前算的一样。
3.png

下面讲讲CUnit吧,我们知道没有扩展的星际单位上限是1700个,他们存在0x59CCA8开始的地址。每个单位的存储字节为336个字节。至于重制版星际为什么可以拓展单位上限呢,可能暴雪又开辟了一块内存专门存多出来的单位,如果知道暴雪操作的方式,就很可能可以在EUD图中拓展单位上限。CUnit就是指某个单位在内存中需要存储的所有信息,包括很重要的Health point,move Speed等等信息.只要我们找到了该单位在内存中的地址,就可以对该单位的属性进行任意修改。怎么找,后续可能需要写代码实现。(写代码可能需要一定的编程经历).第一章大概就这样吧,后续有时间再更,有问题可以直接下帖子里留言。
4.png
扩展一下:学过链表的同学看到*pre,*next就可以知道,CUnit在内存中存储的方式是链表,而且是双向链表。后续遍历所有单位就可以用链表的指针进行遍历,这样星际在用我们写好的代码找单位时,就会变得快很多。




EUD DB - Entry.rar

36.97 KB, 下载次数: 5

回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-26 23:25:20 | 显示全部楼层
本帖最后由 sc_forever 于 2020-2-27 00:05 编辑

第二章:实现对鼠标选取单位进行操作


不知道有没有人看,要是有人看的话可以在帖子下留言,这样我才有更新的动力。这章学习完了就可以立竿见影的看到效果了。图我就不截了,自行打开EUDDB进行查看吧。

在内存表的0x6284E8这个位置,看他的说明可以知道,这个地址是玩家选取单位存储开始的地址,之后记录着玩家一到玩家八的选取单位。通过玩家二选取单位的起始地址减去玩家一选取单位的起始地址,可以得到48字节这个数字。那么为什么每个玩家选取的单位要用48个字节记录呢?因为每个玩家选取的某个单位要用4个字节存储(这个不需要理解记住即可),一共可以选12个单位,于是就要用48个字节存储。

拿玩家一选取单位的地址来说吧,里面存储的是什么东西呢?答:存储的是这个单位在CUnit表里的地址。也就是这个地址里存储的是地址。听起来有点拗口,也就是说我们只要读出这个地址存储的信息,我们也就知道玩家选取的单位在内存中的地址,就可以直接对该单位进行操作了。举个例子吧,假如我们要对玩家二选取的第二个单位进行操作,那么我们需要操作的地址就是:0x6284E8+1*48+4。如果不能理解那么可以记住以下公式,操作玩家X的第Y个单位:0x6284E8+(x-1)*48+(y-1)*4。

那么公式有了,下面讲解一下在EUD Editor2里的做法吧。(EUD Editor2以下统称EE2)在EE2里点开TriggerEditor,新建一个触发,我们就可以对鼠标选取的单位做我们想做的事情了。比如我要将玩家一选取的第一个单位进行回血,那么我们的条件就写这个地址的值不为0(0代表玩家一没有选中第一个单位,如果选中了就一定不为0)我们要操作一个单位的必要条件是这个单位必须被选中。

1.png

动作使我们要让这个单位的血量不断增加(我没有写血量上限判断,但实际过程中血量一定不能超过该单位的血量上限)血量在CUnit中的偏移地址是0x008,我们要修改这个地址让他不断增加。我们看到Hit points后面的说明是*256,也就是说我们在游戏中让单位加一血,修改的数据要增加256。

这里我们一条条说吧,先说第二条,它是EUDTurbo,在动作的EUD下可以选择。他可以让触发执行速度达到每秒23次,是理论上执行最快的速度了,比写了几百条的wait0都要快两倍。(注意:不是所有触发都是执行越快越好,因为每个玩家每秒能执行的触发是有上限的,达到了这个上限就会非常卡.
2.png
第三条选择了RawCode(原生代码)没错就是在触发器里写了代码.这里看懂需要懂一定的编程,简单说下吧,var定义了一个变量叫做base,同时还定义了一个变量叫做hp.然后讲下所有的读写方式.

1.读:bread(地址)(读一个字节的地址)wread(地址)(读两个字节的地址)dwread(读四个字节的地址)

2,写 bwrite(地址,要写入这个地址的值)(写一个字节) wwrite(地址,要写入这个地址的值)(写两个字节)dwwrite(地址,要写入这个地址的值)(写四个字节)

至于要读写几个字节,内存表里肯定会说明的(看到U8表示1个字节,u16两个字节,u32四个字节)

var base=dwread(0x6284E8+0*48+0*4);的意思是读出0x6284E8+0*48+0*4这个地址四个字节的信息给base,可以认为base存储了0x6284E8+0*48+0*4这个地址里的值(base就是我们目前操作的第一个玩家选取的第一个单位的地址)注意后面的分号一定不能漏掉,漏掉就报错了!!0x008是这个单位内部的偏移地址,偏移地址我会放在附件里共享。第二条是读出这个单位的血量给hp,第三条是把hp+1*256写进这个单位的血量地址,也就是让这个单位的血量加一.

注意事项:1.我的操作地址是第一个玩家选取的第一个单位,可以根据公式改变要操作的地址.

                2.不懂编程可能理解比较吃力,可以先照着试试看,看到效果在思考。

                3.选取虫族单位也可以回血,但是血量不会超过上限,因为这个游戏自动判定了虫族单位的血量上限



扩展:1.我们可以在触发器左边的Global Variable里接创建个变量,把0x6284E8创建到变量里.

        2.获取当前玩家可以用getcurpl()函数获得,操作某个玩家选取的第一个单位的地址可以写为:0x6284E8+getcurpl()*48+(1-1)*4

本章希望读者可以动手实践,看到效果再进行学习
update.gif

单位偏移地址信息.doc

112.5 KB, 下载次数: 9

回复 支持 反对

使用道具 举报

发表于 2020-3-15 13:30:15 | 显示全部楼层
对做图很有帮助
回复 支持 反对

使用道具 举报

发表于 2020-3-15 22:16:59 | 显示全部楼层
哇哦 好厉害的样子   还请您继续更新
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-16 19:08:01 | 显示全部楼层
本帖最后由 sc_forever 于 2020-3-16 19:17 编辑

多发了一份帖子,,这里自己顶下吧。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-27 15:12:50 | 显示全部楼层
5.单位释放技能的特效添加

没错,又是我。我又来更新帖子了。第四章先跳过,不是重点。这章我会教大家一个好玩的东西,或者作图过程中非常需要的东西——特效

说到特效,我相信很多人作图过程中会用到红球白球的爆炸或者阿比特的recall技能来制作特效,这样子制作的特效不仅单一,而且非常有局限性。如果我想制作一个RPG图,技能特效是释放阿比特的冰冻或者其他奇怪的动画,那么普通的方法是不能实现或者非常难实现的。那么我们用什么单位来实现特效呢?大部分人都会想不到——雷达。以下我先放给各位一个我的特效成果:单位血条。(稍后我会在附件里上传我的函数,有需要的同学可以来下载。)

11Y46Fqj5K.png

雷达的特效实现其实很简单,主要分三步:

1:在EE里如下修改

EUD_Editor_9nSr63PQXl.png

2:在Sprite修改scanner sweep hit的image,image可以是任何我们想要的图形,前提是该脚本只有init和death,且该脚本会死亡(不会永久循环)不然前者星际会崩溃,后者单位永远不会消失!!例如可以修改我们直接说的recall技能(recall动画只有init和death脚本,且该脚本不会循环,所以可以选取

1MPEqy5aF5.png

3:创建雷达到我们想要的区域,然后在触发下一步直接remove该雷达,如图所示(区域和玩家是你选择的,但是移除的雷达和创建的雷达要属于一个单位。。):

EUD_Editor_wWl4xDfnVV.png

这章确实很简单,但是也非常的实用,具体效果我就不展示了,可以结合代码做出非常酷炫的自定义技能。我制作的血条可以在附件里下载












显血函数by bcbcbc.rar

198.52 KB, 下载次数: 2

回复 支持 反对

使用道具 举报

发表于 2020-4-27 20:24:07 | 显示全部楼层
哇哦  厉害唉
回复 支持 反对

使用道具 举报

发表于 2020-9-6 01:37:55 | 显示全部楼层
大佬有个问题想请教一下,为什么明明没有写异步的触发,甚至把所有EUD的触发删干净了,单位的属性修改也Reset成默认值了,但是只要经过EUD编译的图在联机的时候就会导致导线?

点评

大概率是地形问题,如果是用SCPM作图可能会导致掉线问题。有些地形是EUD不支持的,最好还原地形检查下。  详情 回复 发表于 2020-9-6 16:18
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|站点地图|永恒的星际联盟 ( 苏ICP备17020173号-1 )

GMT+8, 2020-9-19 04:58 , Processed in 0.017184 second(s), 10 queries , Gzip On, File On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表