DWORD dwHeaderSize头文件大小
DWORD dwArchiveSizeMPQ包大小
USHORT wFormatVersion;版本(这个直到WOW熄灭远征才末尾有用,MPQ2这个值是1,魔兽的MPQ1是0)
USHORT wBlockSize块大小,熟习的人普通叫它BUFFER SIZE
DWORD dwHashTablePos;哈希表偏移位置
DWORD dwBlockTablePos;块表偏移位置
DWORD dwHashTableSize;哈希表大小
DWORD dwBlockTableSize;块表大小
};
精细的含义在MPQ解说中我还会引见,这里只说和加密相关的.
1.十分的这种加密也是随着相关MPQ工具而展开的,最早是soar(GA的c-a)的mpqworkshop,这个工具有一个弱点是其寻觅MPQ时需求检验头文件大小(dwHeaderSize)这个值,而由于MPQ1的这个值清楚是活动的32,所以当人为的修改这个数为一个随机数时,该工具就会以为这是个有效的MPQ文件,形成无法翻开,当然清楚了原理后这是很冗杂破解的,而且往常的MPQ工具都疏忽这个过失.不过这个修改这个值简直成了习气,固然没有作用也还一直沿用着.
2.之后出现了w3mmaster和mpqmaster,依然是soar的作品,使用自己制造的mpqlib,可以忽略dwHeaderSize的错误 (同时sfmpq也一样).很长工夫内MPQ头的加密没有新的开展,直到往年终,hackwaly公布了他的研讨效果,新的killmpqmaster加密,实质上是修改块表大小为大于哈希表大小的数.这里繁杂讲一下原理:
最深入的言语来说,MPQ就可以看成一本书,但他有两个目录,哈希表是第一个,当你要找书中的一页时需求先查哈希表,取得块表这个目录的位置,再从块表中查找到精细的页数,而MPQ这本书还有一个特地之处是哈希表这个目录的大小是活动的,也就是说书外面最多能放的页数也是流动的(这就是MPQ中文件数有下限的缘由),而如果我们的方式不能装满整个书的话,那么哈希表的一局部就是空的.而块表不同,他只寄存有效的页,因此他的大小是不流动的,哈希表与块表是逐一对应的,因此块表不能够比哈希表大.
再讲一下MPQMASTER的文件查找原理,自己就会分明为什么修改块表大小会形成这类工具不能读取地图的缘由了.MPQMASTER准确说是 mpqlib.dll是需要枚举MPQ包中的每一个文件的,而魔兽则只需要查找其需要的文件,也就是说,魔兽在翻书工夫接查找目录找文件,而不用去管目录终究有多大,什么时分目录会终了.而MPQMASTER则需要晓得这个,他要先晓得目录的大小才干得知什么时分曾经找到了一切文件,mpqlib是依据块表来查找的,因此如果修改了块表大小,就相当于让他去不具有的目录查找文件,这当然是错误的.
3.修改MPQ包大小(dwArchiveSize)为0,这是我团体最先发明的,原理实际上也和修改块表大小差不多,但实际上还是由于mpqlib的松散性,mpqlib在读取MPQ文件结构时会考证一些数据的准确性,固然不用定有用,但是正是这项检查形成修改MPQ包大小后,mpqlib将地图辨以为错误MPQ.
4.修改哈希表大小(dwHashTableSize),这种加密也和我有肯定联系,不过没有风行起来,而且梦想证明也并不是一种平安的加密
在killmpqmaster加密(工具为hackwaly的w3xmaster)盛行后,mpqmaster的使用遭到限制,当然也出现了不少手动破解方法,不过相对而言最好用的是winmpq和我的ShadowEditor,sfmpq是因为其在查表时是检查哈希表而不受块表错误的影响,同时也不检查 MPQ包大小,因此可以一般翻开w3xmaster加密的地图,不过从w3xmaster0.006末尾采用了修改哈希表的技术而造成其显现错误文件而不那么好用了.同时期我就区分了sfmpq的优点做了ShadowEditor,自动修复一切的头文件错误,修复后可以用mpqmaster打开.作为反 ShadowEditor恢复的第一例,就是55YOU的繁杂做的修改哈希表大小加密,实践上说哈希表大小会直接影响查表的进程,因而不能修改,但确真实一些惯例中胜利了,但并不是一切图都可以,再加上我第一工夫修改了恢复次第,这个加密貌似就只出现了那么须臾的时间- -...
2.使用地图大小限制
魔兽连网是有4M大小限制的,而在早期自己都使用MPQMASTER来修改地图时,由于mpqlib的紧缩功用较差,因而总会造成地图变大,有些加密就是使用这个破绽,在地图较大的状况下直爽直接让地图接近4M,这样随意改动都会造成无法连网.这种加密实践上也在winmpq和偶的 ShadowEditor盛行起来之后变得用途不大了,因为SFMPQ.DLL的紧缩效果要分明好的多.
值得一提的是最近还能见到一些图应用0byte文件来填充的方法把MPQ包添满,当然这也是在地图自身比较大的状况下,这种方法貌似是应用地图大小的升级加密版本,因为这样即使紧缩的很好也有能够超出4M,不过解起来也很繁杂,把这种文件删就好- -,所以觉得是种很搞笑的方法.
3.脚本文件加密
包括3种:
1.最早的是移动脚本,把根目录下的war3map.j放到scripts\下依然可以用,在末尾没有人晓得的状况下,确实找不到脚本,但是往常曾经是路人皆知的事情了,使用Wc3MapOptimizer会自动移到那里去.
2.双脚本,一个在根目录下,另一个在scripts\下,出现两个脚本,迷惘新手而已,当然只需一个是真的,我给他的评价是劳民伤财,白占体积- -.
3.替身脚本,这个实际上有些技术含量,和前面要讲的我的文件隐藏法有肯定的联系,原理上说是应用了魔兽的storm与一般工具的MPQ库之间读取文件的原理差异,在地图中放入两个同名的war3map.j,一个是假的替身文件,在用一般的MPQ工具读取时只能读出假文件,游戏则会读真的,识别方法可以用偶的ShadowEditor打开拓觉两个同名的war3map.j 且大小不一样(大小不一样很主要,因为w3xmaster也有一种能造成这种假象的),这种方法对一切具有写入功用的MPQ工具都无效,不过估量应当不是用某种特地加密器完成的,估量是用了某个MPQ工具的BUG,而且这种方法加大地图体积,还可以用繁杂的方法破解,因此我只说他是实际上有技术含量的东西 - -.
4.文件属性加密
这种貌似是最扯淡的加密了,方法复杂的出奇,而且不简单觉察,就是把地图的属性改成只读,这样任何MPQ工具都不能对其停止写操作了,当然恢复方法不用多说了,不过不仔细的话还真以为是什么勇猛的加密呢,汗......
5.MPQ哈希表,块表加密
这种才可以说是真正意义上有技术含量的加密(相关于Wc3MapOptimizer等工具也算不上有技术- -,不过那些是优化...),从hackwaly的w3xmaster开端.
这里只举两个例子:
1.w3xmaster0.009:未公布的地图加密器,次要原理是将块表扩展为确实比哈希表大,同时打乱哈希表与块表间的衔接,填充无用的哈希空位,迷惘性的复制哈希表项目(这就是为什么ShadowEditor能够读出两个J文件的缘由,自己也可以推想一下替身脚本的原理- -...),再精密的原理我也不想说了,未公布的东西不能乱讲,其实次要是防止我的ShadowEditor对地图停止复原,同时也造成了无法重紧缩的效果,虽然不能防止解压,但是确实比较无效的避免了在原图上进行修改.
2.War3map Encrypt:未公布的加密器, 这个是我做的,也是只简单的讲一下原理:前面曾经说过war3和一般的mpq工具读图原理是有差异的,这也是制造加密的突破口,简单的说这个差异就是在 MPQ中出现同名文件时的处置机制,因为一般的MPQ是不会有同名文件的,因此一般的MPQ工具不会处置这个错误,而war3则会,因此才有了替身文件和隐藏文件的能够,与替身文件不同的是,我的加密是经过间接修改哈希表制造的,因此我不需要替身文件可以直接躲藏文件,同时在加密中参与了SFMPQ列表读取解体和w3xmaster的一些反mpqlib机制,所以现在基本上可以防止一切盛行的MPQ写入工具进行修改,甚至读取.不过既然魔兽可以读取,那么就肯定有方法能解压文件,这种方法是什么我就不想多说了,这里只是加密解说.
话说回来任何加密都可以破解,懂得MPQ中心原理的人应当可以自己写次第破解,不过我的SE暂时是不会再写任何破解模块了...
"脚本类"
从这类开端该当说就是反作弊的范围了,这类出现的前提是无法阻拦脚本文件的解压,以及某些外挂作弊(MH)
1.打乱脚本,变量名交流.
这是最早的了,也是沿用至今的基本方法,代表工具是Wc3MapOptimizer,应用他进行脚本优化后,脚本中放在一同的T相关函数被聚集并进行同类汇总,删除注释,这样造成脚本可读性变差,但是真正使可读性变得很差的还是重新用字母或数字来交流那些故意义的函数名,这样就给了解脚本造成了很大的省事,因此修改脚本时需要的是关于J文件的深化理解了.
2.增加作弊检查的函数.
这类方法很多,比如检查玩家的资源数等,只需超出合理范围就判定为作弊,同时可以检查能否使用了单机秘籍.其中还有一类比较诙谐的方法是在游戏中读取wts文件的字符,如果修改者修改了某些字符,如作者信息之类就判定此图为盗版.
3.抑止单人游戏.
这种多用于ORPG,防止单机秘籍的使用造成游戏平衡性破坏.
方法有几种,比较好用的有区分能否可以保管缓存,单机可以,多人就不行,另外辨别能否可以保管游戏也可以做到,非常是只需单机可以.
单机辨别和作弊检查函数辨别,同时聚集写上多个处辨别函数,可以使修改者不简单删除辨别函数,而且在判断为作弊后采用死循环或少量制造单位的方法来志愿地图出错,也可以防止修改者经过文字信息来找到相关函数.
4.反MH函数.
MH无疑是最让对沙场图头疼的东西,不过在kook,hackwaly,朱朱等人的研讨下,确实找到了一些反MH的脚本方法,我没有仔细看过他们的脚本,所以以下只是简单的写点基本原理,如有不对的中央还请指正- -:
1.经过触发选择不可见单位,然后判断能否出现吊销选择的事情来判断是否使用MH,在开了MH后是不会出现吊销选择的事情的.
2.经过在不可见区域创立闪电特效,如果没有开MH不会前往句柄,开了就会有.
3.使用由hyp制造的看见就会造成游戏错误的模型.
"特地标示类"
说到特别标示,最先想到的该当是官方的兰色小标志,这一类就是采用各种算法来给地图加上独自的标示,经过标示可以便利的识别正版地图.
1.官方的签名.
这个不知道有几人想要破解了,不过现在还没有人胜利,而且估量也不可能有人成功
原理:对地图方式进行SHA-1摘要,然后对摘要的结果进行RSA运算,当然懂RSA的人该当知道这运算是要有自己的私钥的,结果是一个260字节的签名,放在地图开端,在game.dll中有检验这个签名的公钥,只需考证成功就会加上兰色小标志.
知道原理就不难理解为什么这个是不可能破解的了,首先RSA现在还没有破解实际,其次你不可能从暴雪手里偷到那个私钥,因此该签名是目前最平安的防盗版方法.
2.GA的签名.
既然我们不可能从官方取得地图签名,那我们就自己改,经过将game.dll中的公钥修改为自定义的和自己的私钥相婚配的数据,我们就可以做自己的签名了,这就有了GA的补丁,不过的确这种补丁的推行很难,宽广玩家并不像地图作者那样需要他......
3.盗版地图删除器.
这个东西的作用不是很大,但终究起过一些作用,这里把他放在标示类也有一些原因.
原理:早期的盗版地图删除器如3CORC之类的,是依据地图大小来判断是否正版的,这样做的缺陷是每更新一张地图就需要更新一次删除器的列表,比较省事. 前期我为WOW8制作的删除器是采用相似签名的摘要加密法,不知道原理的状况下很难仿制,而且随意的更改都会造成不婚配,这样只需用删除器对签名进行判断就可以考证是否是正幅员,不需要更新列表这种省事事.至于算法可以自己随意选择,如MD5,RSA等知名的算法...
4.(attributes)文件.
这个文件是官方检验地图文件是否受损的文件,也是一切改图者必删的文件,否则游戏中就会提示文件错误.
原理:这个文件是依照MPQ中的文件次第将每个文件的CRC32值,文件时间等数据放入(attributes)中,游戏中进行检验,在MPQ2中应该还包括MD5校验.
这个东西由于一般都被删了所以也没什么作用,不过可以是另外一种盗版地图删除器的判断方法,参与自定义的校验文件(里面包括关键文件的MD5,CRC32等值),然后检查时自动查找就可以了,由于是自定义文件名,也不简单被直接找进去.
我也不知道是不是。
电脑访问官方网址。
Soar的定位是一个有回想的并能实时更新的超级地图系统。团队通过多年在空间地图行业的技术积聚,Soar在地图精度、数据源等方面取得大幅提升。与区块连技术的创新分别,为元数据完成了溯源且不可窜改。同时为上传的数据加入了时间戳,使得在检查地球恣意地域地图数据时,不但可以看到这个中央现有的子,能检查其1年前、10年前的样子。Soar在空间地图底层范畴的革命,将为未来空间地图的商业价值带来有限的可能。
Soar由于具有抢先全球的空间地图技术,现已与欧洲宇航局、阿里云、大疆无人机、国度天文杂志达成了战略协作,并且通过Soar经济机制,完成静态指点全球范畴内地图数据方式的发生,完成生态的安康开展。
-=兽人=-
苦工-
=建造音效=
- Ready to work! 准备义务
=选定音效=
- Hmmm? 恩?
- Yes? 是的?
- Something need doing? 要做点什么吗?
- What you want? 你想要什么?
=举措/施举措作音效=
- Okie dokie. 好的好的
- Be happy to. 很甘愿
- Work, work. 干活呀干活
- I can do that. 我做的了
=骂玩家音效=
- Whhaaaaaattt? 什 么???
- Me busy, leave me alone. 我很忙,别烦我
- No time for play. 没时间游玩
- Me not that kind of Orc. 我不是那种兽人
=攻击音效=
- [.vs 俊杰] Why not? 为什么不?
- I''ll try 我试一下
- Get em! 扁他们!
- Ok 好!
=击中音效=
- Owww! 喔
咕噜兽-
=建造音效=
- My life for the Horde! 为部落而生!
=选定音效=
- Yes? 是的?
- Huh? 哈?
- Master? 主人?
- What you want? 你想要我干什么?
=举措/施举举措音效=
- Loktar! 兽人语
- Zugzug! 兽人语
- Dabu! 兽人语
- Swobu! 兽人语
=骂玩家音效=
- Why you poking me again? 为什么又戳我?
- Why don''t you lead an army instead of touching me? 你怎样不去指挥部队而一直碰我?
- Poke, poke, poke, is that all you do? 戳戳戳,你就会干这个吗?
- Eww, that was kind of nice. 呃,这还差不多
- Me so horned, me hurt you long time! 我有角,我会伤到你的哦
- Me no sound like Yoda, do I? 我听起来不象尤达(星战系列),(以尤达的口吻)是吗?
- It not easy being green... (用唱的) 绿皮肤可不简单哟~
=攻击音效=
- [.vs 俊杰] For the Horde! 为了部落!
- Hiyah! 嗨呀!
- Time for killing! 屠戮的时辰到了!
- Time to die! 去死吧!
猎头者-
=建造音效=
- Venegence for Zulti 为Zul'jin报恩!(zul'jin是魔兽2中的巨魔族老大)
=选定音效=
- Who you want me kill? 想让我杀谁?
- What? 什么?
- Wasch you want me do?* 想让我干吗?(Wasch you=what you,读读看是不是这样?)
- Wasch you want me go?* 想让我去哪?(该是where''j you,参见battle.net creeps中的Forest troll页)
=举措/实施举措音效=
- Ahhh! 啊!
- Anything you want 怎样都行
- Joo got it man!* 了解了兄弟
- Yeah, hehe hehe hehe he! 耶~呵呵,呵呵,呵呵,呵!
=骂玩家音效=
- Wasch you bother me for?* 为什么烦我
- Leave it to me, I take a big weight off your shoulders! 交给我吧,我给你减轻担负
- Schoo wanna buy a cigar?* (Schoo=you) 你想来只烟吗?
- Luuucyy!
- Say hello to my lil friend.跟我的小冤家说声好
=攻击音效=
- [.vs 俊杰] Asdingo! 兽人语
- Asdingo! 兽人语
- Don''t mess with the bad guy! 别惹我,我是个坏人!
- It''s time for a lil blood! 血债血偿!
弩车 - (注释:音效全是乐音没有文字 )
牛头人 -
=建造音效=
- May my ancestors watch over me! 愿我的祖先注视着我!
=选定音效=
- Bring it on! 来吧!
- I am able to help! 我帮的上忙
- How now! 现在怎样样?
=举措/实施举措音效=
- For the Tribes! 为了部落!
- Immediately! 立刻!
- Well done! 干的好!
=骂玩家音效=
- Do not push me, or I wil impale you on my horns! 别推我,要不我会用我的角顶你。
- Doubles!
- Got Milk? 要奶吗?
- There''s a lot at stake here! 别的中央有很多树桩!
- Hey, what are these letters burned on my ass? 嗨,在我PP上印的什么字?
- Oh ley !**
- (玻璃碎裂) Sorry! 负疚!
=攻击音效=
- [.vs 豪杰] Ruuuuaahh! 喊声
- Death to the enemies of the Horde! 部落的冤家受死吧!
- Death to the Enemy! 朋友受死吧!
- Start running! 逃窜吧!
=击中音效=
- Euuhhhhh! 喊声
狼骑兵- (兴味正文: 他的死亡音效文件名是''raiderdeath''但他叫做 ''wolfrider'' )
=建造音效=
- Ready to ride! (狼的喘气和吠叫声) 狼骑就绪!
=选定音效=
- Yes Cheiftan? (狼的喘气声) 是,酋长?
- Hmmmm? (狼的嗟叹声) 恩??
- Need something? (狼的喘气声) 需要什么吗?
- Say the word! (狼的吠叫声) 说啊!
=行动/施行举措音效=
- No problem! (狼的吠叫声) 没效果!
- Hi yah!* (狼的跑动声) 嗨呀!
- Mush! (狼的跑动声和嗟叹声)
- Let''s ride! (狼的跑动声和嗟叹声) 冲吧!
=骂玩家音效=
- Down boy! (狼的吠叫声) 下去,小孩!
- You''re annoying my dog! (狼的吠叫声) 你若恼我的狗了!
- What''s that smell? (狼的喘气声) Oh! Bad dog! (狼的哭叫声) 那是什么气息?啊!坏狗狗!
- I''m hungry like the wolf! (狼的笑声) (注释: 听起来想狼的笑声... 当然,如果它们能笑的话) (用唱的) 我饿的象头狼!
=攻击音效=
- [.vs 豪杰] For the glory of the War Chief! 为了酋长的荣耀!
- Sick em! (狼的咆哮声)
- Taste my steel! (狼的吠叫声) 尝尝我的铁刃!
- For Doomhammer! (狼的吠叫声) 为了消灭之锤(一个部落吧?)
飞龙骑士-
=建造音效=
- Ready to soar Master! 准备飞行,主人!
=选定音效=
- Are there enemies above? 有朋友在公开吗?
- Un double!*
- Sping Chieftan!* 正在侦查,酋长!
- I need order! 我需要命令!
=行动/执行举措音效=
- To the winds! 与风同行
- Let''s fly! 我们飞吧!
- Onward and upward! 向前,向上!
- Yee Haw! 呀呼~
=骂玩家音效=
- Peter! I can fly! Peter,我会飞了!Peter.
- I can see my house! 我看家我家房子了!
- The onnnly way to fly! 飞行的独一方法
- I''m getting a little dizzy! 我有摇头晕了!
- Flash! (飞兽在咆哮) Ah ha ha! 闪光吧,啊哈哈!
- Fly the friendly skies! 飞向友好的空中!
- Look, up in the sky! It''s a bird! It''s a plane! It''s ME! 看公开,那是一只鸟,那是一架飞机,那是我!
=攻击音效=
- [.vs 豪杰] Death to all who oppose the Horde! 挡我部落者死!
- Die! 死!
- Death from above! 空中者死!
- Victory for the Horde! 我族必胜!
- For the glory of the Horde! 为了部落的荣耀!
柯多兽- (兴味注释: 在游戏和建造描画里面它们都叫''Kodo'' 但是在音效文件里面它们都叫 ''Koto'' ) 所有其他音效都是柯多兽的咆哮.
=骂玩家音效=
- Here comes the beast again! 野兽又回来啦!
萨满法师 -
=建造音效=
- Storm, Earth, and Fire, head my call! 风暴,大地,火焰,接受我的召唤吧!
=选定音效=
- Yes? 是?
- Yes, War Chief? 是,酋长?
- How can I help? 要我怎样辅佐?
- Direct me! 指引我吧!
=行动/执行举措音效=
- Understood! 了解!
- A wise plan! 明智的计划!
- For the Horde! 为了部落!
- Right away! 立刻!
=骂玩家音效=
- You ever get hit by lightning where the sun don''t shine?你曾在没有太阳的中央被雷击过吗? (闪电声) (注释: 哎哟!)
- Back off pup! 行进,小子!
- The sky is falling! 空中,正在坠落!
- Raindrops keep falling on my head! (用唱的) 雨水不停落在我的额头~~
- No time for play, we have war to ! 没有时间玩啦,我们有仗要打!
- Electrifying! 放电!
- Blame it on the rain! Huh ha ha! 怪那些雨水吧!哼哈哈哈!
=攻击音效=
- [.vs 豪杰] I dedicate my power to the Horde! 为部落贡献我的力气!
okt- Thunder! (雷鸣声) 雷!
- Power to the Horde! 以部落的力气!
- Feel the ground trrremble!* 感受大地的哆嗦吧!
- Lightning! (闪电声) 电!
巨魔巫医-
=建造音效=
- Someone call for de doctor?* 有人召唤巫医吗?
=选定音效=
- I hear de summons!* 我听到了你的召唤!
- How may I serve? 我要怎样效力?
- You sick, me help? 你生病,我辅佐?
- What you be cravin?* 你在期望什么?
=行动/执行举措音效=
- Pasdingo! 兽人语
- Ride eway!* (Right away!) 立刻!
- Da be good choice, man!* 准确的选择,兄弟!
=骂玩家音效=
- E com bou com!* ** 兽人语
- Do you be feelin well?* 你觉得好吗?
- I may have somethin for ya!* 我可能有东西要给你
- We be jammin! 有干扰!
- It''s a cook book. A cook book! 这是一本烹调书,一本烹调书!
- Soil and grain is made from Trolls!
- [广播员]: Fankuisan? [Fakuisan]: Yes? Go ahead. [广播员]: What the Iron Troll is doing right now, is putting the heads in a pot. They have to boil for 20 minutes, so that the eyes can be used in a second dish, an eye and ra**erry sorbet. [女声]: Mmmm! Sounds good! (可以分明得听见头一般一声掉进水的声响)
[播送员]: Fankuisan? [Fakuisan]: 恩?说吧. [播送员]: 现在武装巨魔在做的就是把他们的头放进一个罐子里.蒸他们20分钟,然后眼睛就可以用在甜点上,一个有眼睛的果汁冰糕. [女声]: 恩~~~~听起来不错啊~!(可以分明得听见头一般一声掉进水的声响)
=攻击音效=
- [.vs 豪杰] Ahhh! 啊!!
- I do it... Now! 现在就做!
- Blah aha hul!* ** 兽人语!
- Blah!
剑圣- (英雄,城镇中心)
=建造音效=
- I obey the six vengance!
=选定音效=
- I am yours! 我属于你!
- Ohh! 噢!
- Yesa, Lord!* 是,仆人!
- What task is there?有什么权益?
=行动/执行动作音效=
- I hearo and obey!* 我听从命令!(剑圣说的是日式英语……把r音发成鲁等)
- Hai! 日语,嗨咿!
- Excellent choice! 完美的选择!
- Yes, huh! 是,哈!
=骂玩家音效=
- Snatch the pebble from my hand, grasshopper!
- My a blade can cut through armor, and still cut a tomato!* 我的刀可以切穿盔甲,切到里面的番茄(心脏)
- Twin blade action, for clean, close shave everytime! 看我的双刀流……每次都可以把脸刮的很洁净~(剔须刀呀?)
- Wasabi! 日语,芥末 (……剑圣整个一日本武士)
=Attack Sounds=
- [.vs 英雄] For the burning Blade! 为了熄灭之刃
- Taste a* my blade! 尝尝我的利刃
- Ailease! *喊声*
- Hooah! *吼声*
先知- (英雄,城镇中心)
=建造音效=
- The future is ours! 未来属于我们!
=选定音效=
- My eyes are open. 我洞悉一切
- Seeing is believing! 眼见为实
- Do you need my counsel? 需要我的正告吗?
- Destiny awaits. 命运在等候
=行动/执行动作音效=
- It is certain. 确信无疑
- Of course. 当然
- I see. 清楚
- Watch out!
=骂玩家音效=
- I see dead people. 我看见死人了(开地图秘籍哦,果真是farseer)
- Touch you tongue to mine! 敢用你的舌头舔我! (狼的嗟叹声)
- Concentrate and ask again. 思想集合一点!再问我一遍
- Outlook not so good. 前景不太梦想(暗指微软的outlook不太好用)
- Reply hazy. Try again! 回答的摸棱两可,再说一遍!
=攻击音效=
- [.vs 英雄] Spirits of Earth and Storm, strike! 大地与风暴的灵魂啊,攻击吧!
- Strike! 进攻!
- Look out! 留意!
- Attack! 进攻!
牛头人酋长- (英雄,城镇中心)
=建造音效=
- I have an axe to grind! 我有把斧子要磨
=选定音效=
- I stand ready! 我准备好了
- Your command? 你的命令?
- Your order? 你的指示?
- What would you ask of me? 你要我做什么?
=行动/执行动作音效=
- Done! 完成!
- For my ancestors!为了我的祖先们!
- An excellent plan! 好计划!
- Yes Chieftan? 是,酋长?(他自己也是酋长哦)
=骂玩家音效=
- Mmmm. My back is killing me! 唔,我的后背要了我的命。
- I need to take a load off! 我需要减轻负荷。
- Rrrrggg! I think I have a splinter! 呃啊~~~~我想我的骨头碎了!
- These poles are heavy, I should find someone else to tote em!这些柱子好沉啊,我该找别的人来背它(找个真人来作我的图腾)
- I used to have to go to war uphills, both ways!我以前打仗的时分还得上坡,两个方面……
- Your way, right away! 一是你上,二是立刻
=攻击音效=
- [.vs 英雄] For the War Chief and the Tribes! 为了酋长和部落!
- For the Tribes! 为了部落!
- Honorguide me!* 声誉指点着我!
- None shall pass! 把命留下!
太多了,楼主看我的链接吧
楼上错误!!!!
这样会招致严酷BUG
需要用JASS
使用回想功用,存储每个格子的物品,切换的时分就不会有冷却突然消逝、可冲物品变满、触发物品失效等严酷BUG
1. jass的特性
jass言语是一个语法非常简单的言语,语法结构上比较接近basic,同时也援用了许多c的东西。
2. 如何进修和使用jass
在trigger editor窗口中,我们可以很简单的把一个t转成j,方法是Edit(alt+e)-Conver to Custom Text(x),然后我们就可以在已有的j的基础上进行编辑。
由于we里的文本编辑器功用不够丰厚,另外,we的容错机制比较差(j的错误太多简单招致直接封锁),所以这里引荐两个特别用于jass编辑的工具:jass editor(汉化版)和jass workshop(by soarchin)。两个工具各有各的特性,前面会在触及到的部分提到。
另外还需要获得cj和bj两个接口函数库,这个在je和jw中均有提供
3. jass和trigger的联络
在地图编辑进程中,绝大少数用j能够完成的东西也能够用t来完成。梦想上,所有的t最后都会转化成j,trigger只是面向we的单独体系。详细的说,war3提供的API有common.j和blizzad.j两个文件,其中com.j是地道的接口,而blz.j是对cj里面接口函数的封装,次要面向trigger editor,t生成的j代码中,绝大少数函数都是bj里的。
4. 为什么要进修j
a.用heavylock等工具紧缩后,trigger和j面向we的部分被删除了,只留下script.j里面洁净的j部分,为了研讨他人的map,就要能读懂他人的代码;
b.t虽然能完成简直所有的功用,但是对于内存释放和另外一些功能完成的才干太差;
c.虽然t看似是一个语法结构完整的可读性比较高的语句,但是因为经常语句太长招致可读性大大下降,而j可以更便利的表现逻辑性,梦想上j的可读性更强;
d.用j可以写出比t效率高很多的代码,当然这是在对计算机义务原理比较了解的前提下。
准备知识:
在war3种,blz为每个unit和item都提供了一个integer型的UserData,让各位mapper可以很便利的做一些事情(有点像windows规范控件的tag属性)。
思绪:
首先是要在hero使用技艺的时分触发这个trigger,然后把hero身上的item移走物品,下次的时分再把物品取回来,所以我们要给物品创立一个数组来保管。一个物品栏有6个物品,每个hero有n1个物品栏,又有n2个hero,可是jass只提供了1维数组,怎么做呢?聪明的你肯定想到了x*a*b+y*b+z的办法,的确这样,我们就给每个hero一个特定的整数标志,每个物品栏一个数字,这样就可以了。下面是利用unit的userdata的完成方法。这个方法共支持8个物品栏
全局变量:
integer udg_iUnitIndex //用来使每个unit有共同的id
item array udg_itemGoods //用来存取所有的物品栏中的物品
函数:
//unit物品栏ID:使用userdata的1-3 bit;共支持2^3=8个物品栏,如果想再多的话,就把里面的数字乘以2就可以失掉16个了
//用来读取物品栏id:
function fiGetUnitDataGoodsID takes unit whichUnit returns integer
//由于只是用0~7这几个数,所以我们只要去modulo(模,可理解为余数)就可以了
return ModuloInteger( GetUnitUserData( whichUnit ), 8 )
endfunction
//用来寄存物品栏id:
function pSetUnitDataGoodsID takes unit whichUnit, integer newData returns nothing
local integer it=GetUnitUserData( whichUnit )
//新的id只要用newData再加上原本的数字除以8的整数部分乘以8就够了
call SetUnitUserData( whichUnit, ( it/8*8 + newData )
endfunction
//Unit - UnitID:7~ bit;用来记载单独的Unit
function fiGetUnitDataID takes unit whichUnit returns integer
//只要整数部分就可以了
return GetUnitUserData( whichUnit )/8
endfunction
function pSetUnitDataID takes unit whichUnit, integer newData returns nothing
local integer it=GetUnitUserData( whichUnit )
//将新的数字乘以8之后,再加上余数部分就可以了
call SetUnitUserData( whichUnit, newData*8+ModuloInteger( it, 8 ) )
endfunction
下一步,我们要设定一个全局变量,在每个hero出现的时分,加上这么两句:
set udg_iUnitIndex=udg_iUnitIndex + 1
call pSetUnitDataID( udg_iUnitIndex )
然后是unit切换物品栏的action:
//失掉以后的unit
local unit u=GetTriggerUnit()
//失掉下一个物品栏的id,由于只是0~7这几个数字,所以只要在每次+1之后取除以8的余数就可以了
local integer index=ModuloInteger(fiGetUnitDataGoodsID(u)+1,8)
//失掉userdata,由于这个data已经有独立的unit的id和item的id,所以不必辨别取了
local integer id=GetUnitUserData(u)
local integer i=0
local integer it
//保管以后身上的物品,并丢在躲藏的地方
loop
exitwhen i5
set it=id*6+i
//设定物品为当前物品栏第几栏的物品
set udg_itemGoods[it]=UnitItemInSlot(u, i)
//移到地图隐蔽处
call SetItemPositionLoc(udg_itemGoods[it],udg_locItemTemp)
call TriggerSleepAction(0)
//使物品无敌
call SetItemInvulnerable(udg_itemGoods[it],true)
//使物品不可见
call SetItemVisible(udg_itemGoods[it],false)
set i=i + 1
endloop
//设定下一个物品栏标号
call pSetUnitDataGoodsID(u,index)
set id=GetUnitUserData(u)
set i=0
//取回物品
loop
exitwhen i5
set it=id*6+i
//使物品可见
call SetItemVisible(udg_itemGoods[it],true)
//使物品不无敌
call SetItemInvulnerable(udg_itemGoods[it],false)
call TriggerSleepAction(0)
//放回物品栏
call UnitAddItem(u,udg_itemGoods[it])
set i=i + 1
endloop
* 补充: ModuloInteger是bj函数:
function ModuloInteger takes integer dividend, integer divisor returns integer
local integer modulus=dividend - (dividend / divisor) * divisor
if (modulus0) then
set modulus=modulus + divisor
endif
return modulus
endfunction
前面引见过if语句的速度要比运算满很多,因为我们这个函数里面不触及到正数,所以在这里我们可以自定义一个自己的函数:
function MyModuloInteger takes integer dividend, integer divisor returns integer
return dividend - (dividend / divisor) * divisor
endfunction
终了
标签: okt