找回密码
 点一下
查看: 1230|回复: 12

定制WE的问题

[复制链接]
发表于 2009-6-17 21:39:51 | 显示全部楼层 |阅读模式
你可能额外地需要这些工具:
winhex,zeroadd,偏移量转换器

思路,首先是了解UI的格式,无非是把函数写成UI。所以关键是函数,如果函数是cj或bj中有,但是没有加到UI中,你可以直接编写UI来添加。如果没有现成的函数(即自定义的函数),那么你写好UI之后是不能使用的,所以handle GUI和WEU都几乎使用了一个办法来解决,把这些函数添加到自定义脚本区中, 不同的是前者需要你自己添加,后者是创建地图的时候自动添加进去。

我有幸找到一种让WE自动把自定义脚本添加到war3map.j中的办法,而不需要你自己去添加或者额外地工具来自动添加,不过它只是一种实现的办法,并不是好的办法。

前面的废话你可以不看,但是下面就开始进入正题了。请认真阅读:

一,首先是修改worldedit中的字符串资源“endglobals”,把它替换成我们的自定义脚本。你可以在“endglobals”前面加上你的脚本需要的全局变量,在后面加上你的自定义函数。具体方法如下:

1,给worldedit.exe添加空余空间。
运行zeroadd,点击“Pick a file”找到worldedit.exe,勾上“BackUp”,下面两个框需要输入的是新的PE节的名字和节的大小。我这里输入的是hjass和4000。

20081215_c1220101e255161f5a9d3LwfH7zWrDtO.jpg

2,添加我们的字符串资源。
使用winhex打开worldedit.exe,在文件末尾往前,能找到刚添加的0x4000字节的空白空间。
从中间随便找个位置,然后把位址输入偏移量转移器中的文件偏移,按“>>”按钮进行转换。把得到的内存地址记下来。我这里的是427200->00883000。可能会出现错误情况。如图,我这里就找到了一个位置,可以输入自定义脚本了。

20081215_54b5bf4268ea70e050eboDWjWDtj45lC.jpg

20081215_f331aed853219106070d9H8GIGK25GQw.jpg

把光标选到右边的文本显示区对应位置,输入我们要替换endglobals的文本。注意换行符需要在左边的HEX编辑区输入,为0D0A。我这里没有全部输入。



3,替换“endglobals”为我们的字符串。
使用winhex搜索文本“endglobals”,会找到原来的字符串的位址,然后用偏移量转换器转换为内存地址,记下来,我这里是:3D80AC->007D9AAC

20081215_9ea1c67935513b305166MntA6F6kzcuF.jpg

然后选择winhex菜单“搜索-替换16进制数值”,把007D9AAC替换为00883000(按小端字节序输入)如图:

20081215_097ad92deb60a89c3f220zo8tIafoKNm.jpg

4,保存
 楼主| 发表于 2009-6-17 21:46:49 | 显示全部楼层
我按照步骤一步一步来做,但生成的WE要么定位字符串错误,要么就是自WE出错而自动关闭......



恳请各位朋友们如上帝般拯救我,在此致谢.............
回复

使用道具 举报

发表于 2009-6-17 21:52:19 | 显示全部楼层
对于这种高深问题只能看看而已拉```````````````````````````
回复

使用道具 举报

发表于 2009-6-17 22:54:26 | 显示全部楼层
不要照着这个做
这个属于早期研究者们制作加强WE的方法
而且自己明白了也不需要做成傻瓜式的

对于一个自定义函数Lunaaction,你在你的每一张使用这个UI的地图中手工在自定义代码区域内将你的自定义函数复制过去
在UI/TriggerData.txt中的[TriggerActions]标签后面你自己想要的位置中加入以下:
Lunaaction=0,trigger                                   //此处填写第一位是版本,可以不管。第二位和以后是函数参数
_Lunaaction_Defaults=GetTriggeringTrigger     //参数的默认值
_Lunaaction_Category=TC_TRIGGER                //目录,就是你这个动作放到哪一类中,这里是“触发器”类别中
注意不要把原来的的打断(我没测试过是否有影响)

在UI/TriggerStrings.txt的[TriggerActions]标签后面你自己想要的位置中加入以下:
Lunaaction="自定义1"                                    //函数名=“你想要在we中显示的名字”
Lunaaction="自定义2",~Trigger                       //函数名=“”下面 解释(1)
LunaactionHint=                                             //就是编辑器那个框中下面的那些灰色说明文字

解释(1)比如说你想要显示  杀死(没有单位)并且(是)删除尸体,放到单位类别中
function Lunaaction takes unit u,boolean b returns nothing
if b then   
call KillUnit(u)
else
call RemoveUnit(u)
endif
endfunction

UI/TriggerData.txt
//Luna actions
Lunaaction=0,unit,boolean
_Lunaaction_Defaults=null,false
_Lunaaction_Category=TC_UNIT

UI/TriggerStrings.txt
//Luna actions
Lunaaction="杀死单位"
Lunaaction="“杀死”,~unit,“并且”,~boolean,“删除尸体”
LunaactionHint=“我自己的杀死单位函数”

解释(2)TC_TRIGGER 这个可以在UI/TriggerStrings.txt最前面,你可以像添加变量一样(其实是常量定义)添加自己想要的目录名

注释(3)或许有笔误:半角全角,单词拼写等
回复

使用道具 举报

发表于 2009-6-17 23:06:27 | 显示全部楼层
如果你本来就用的加强版的WE,你可以直接找到UI文件,如果有代码注入功能,你可以将你的函数复制到它的注入代码文件中,省时省力
回复

使用道具 举报

 楼主| 发表于 2009-6-17 23:26:14 | 显示全部楼层
引用第4楼lunaflywar于2009-06-17 23:06发表的  :
如果你本来就用的加强版的WE,你可以直接找到UI文件,如果有代码注入功能,你可以将你的函数复制到它的注入代码文件中,省时省力
请问哪里有这样的WE下哉?
回复

使用道具 举报

 楼主| 发表于 2009-6-17 23:37:01 | 显示全部楼层
补上我写了函数的WE

地址是004466A0
WinHex JPG.JPG



该WE只用了zeroadd增加字节空间并在新增的空间写了函数
如果可以的话 ,帮我偏移一下

WorldEdit.rar

1.31 MB, 下载次数: 12

回复

使用道具 举报

发表于 2009-6-18 08:46:09 | 显示全部楼层
引用第4楼lunaflywar于2009-06-17 23:06发表的  :
如果你本来就用的加强版的WE,你可以直接找到UI文件,如果有代码注入功能,你可以将你的函数复制到它的注入代码文件中,省时省力

请问那个加强版的WE有代码注入功能?
回复

使用道具 举报

发表于 2009-6-18 18:44:08 | 显示全部楼层

好了
帮你在开头加了个0D0A,否则肯定跳错
这个是偏移好了的
MS我加的那个0D0A多余了 这个是效果
[jass]
//===========================================================================
//
// New WarcraftIII Map
//
//   Warcraft III map script
//   Generated by the Warcraft III World Editor
//   Date: Thu Jun 18 19:06:59 2009
//   Map Author: unkonw
//
//===========================================================================

//***************************************************************************
//*
//*  Global Variables
//*
//***************************************************************************
globals
    // Generated
    trigger                 gg_trg_MapsInitialzation   = null
    trigger                 gg_trg_NewTrigger_001      = null

gamecache Sandy_GC=InitGameCache("Sandy.w3v")
integer Sandy_DamageTrigger_Cont=0
trigger array Sandy_DamageTrigger
trigger array Sandy_AnyDamageTrigger
triggercondition array Sandy_AnyDamageTriggerCondition
integer array Sandy_AnyUnit
boolean array Sandy_UnitUseing
group Sandy_G
endglobals
function S_H2I takes handle h returns integer
return h
return 0
endfunction
function S_I2U takes integer i returns unit
return i
return null
endfunction
function S_I2T takes integer i returns timer
return i
return null
endfunction
function S_I2TD takes integer i returns timerdialog
return i
return null
endfunction
function S_I2TG takes integer i returns trigger
return i
return null
endfunction
function S_I2TA takes integer i returns triggeraction
return i
return null
endfunction
function S_I2TC takes integer i returns triggercondition
return i
return null
endfunction
function S_I2RE takes integer i returns rect
return i
return null
endfunction
function S_I2E takes integer i returns effect
return i
return null
endfunction
function S_I2D takes integer i returns destructable
return i
return null
endfunction
function S_I2L takes integer i returns lightning
return i
return null
endfunction
function S_I2P takes integer i returns location
return i
return null
endfunction
function S_H2S takes handle h returns string
return I2S(S_H2I(h))
endfunction
function S_Hash_Unit_S takes handle h returns integer
local integer I=S_H2I(h)
local integer IA=I-I/8191*8191
local integer IB=I-I/8179*8179+1
local integer Con=0
loop
exitwhen(Sandy_UnitUseing[IA]==false)
set IA=IA+IB
set Con=Con+1
if (IA>=8191) then
set IA=IA-8191
endif
endloop
set Sandy_AnyUnit[IA]=I
set Sandy_UnitUseing[IA]=true
return IA
endfunction
function Unit_Hash_Get takes handle h returns integer
local integer I=S_H2I(h)
local integer IA=I-I/8191*8191
local integer IB=I-I/8179*8179+1
local integer Con=0
loop
exitwhen(Sandy_AnyUnit[IA]==I and Sandy_UnitUseing[IA]==true)
if Sandy_AnyUnit[IA]==0 then
return -1
endif
set IA=IA+IB
set Con=Con+1
if IA>=8191 then
set IA=IA-8191
endif
endloop
return IA
endfunction
function RemoveHash takes integer i returns nothing
set Sandy_UnitUseing=false
endfunction
[/jass]

WorldEdit.rar

1.32 MB, 下载次数: 5

回复

使用道具 举报

发表于 2009-6-18 18:44:46 | 显示全部楼层
删掉小标题了
引用第7楼w062c30于2009-06-18 08:46发表的  :


请问那个加强版的WE有代码注入功能?

WOW8编辑器第一版给非JASS玩家用的那个版本有
回复

使用道具 举报

 楼主| 发表于 2009-6-18 22:12:15 | 显示全部楼层
已解决,锁....................
回复

使用道具 举报

发表于 2009-6-18 22:20:14 | 显示全部楼层
1.23B出来才有更多东西玩~WOW8也有大工程~
回复

使用道具 举报

发表于 2009-6-18 22:26:29 | 显示全部楼层
1.23B的那个已经很浅显了吧,不需要那些无聊的所谓系统了吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-11-25 15:59 , Processed in 0.116302 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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