找回密码
 点一下
查看: 4943|回复: 38

一个XX的模板

[复制链接]
发表于 2008-12-5 16:15:45 | 显示全部楼层 |阅读模式
[codes=这个是为了方便加的jass]globals
handle H
code C
trigger T
integer I
constant gamecache RGC=InitGameCache("|cffc5d43ecccty1l|r")
endglobals
//! define DEff(e) DestroyEffect(e)
//! define AEff(mod,x,y) AddSpecialEffect(mod,x,y)
//! define AEffT(mod,target,point) AddSpecialEffectTarget(mod,target,point)
//! define Eff(mod,x,y) DestroyEffect(AEff(mod,x,y))
//! define EffT(mod,target,point) DestroyEffect(AEffT(mod,target,point))
//! define SetInt(arr,s,val) StoreInteger(RGC,arr,s,val)
//! define SetInts(arr,s,val) StoreInteger(RGC,arr,s,val+GetStoredInteger(RGC,arr,s))
//! define SetBoolean(arr,s,val) StoreBoolean(RGC,arr,s,val)
//! define SetReal(arr,s,val) StoreReal(RGC,arr,s,val)
//! define SetString(arr,s,val) StoreString(RGC,arr,s,val)
//! define GetInt(arr,s) GetStoredInteger(RGC,arr,s)
//! define GetBoolean(arr,s) GetStoredBoolean(RGC,arr,s)
//! define GetIf(arr,s) if(GetStoredBoolean(RGC,arr,s))then
//! define GetOr(arr,s) elseif(GetStoredBoolean(RGC,arr,s))then
//! define GetReal(arr,s) GetStoredReal(RGC,arr,s)
//! define GetString(arr,s) GetStoredString(RGC,arr,s)
//! define FreeString(s) FlushStoredMission(RGC,s)
//! define Freei(arr,s) FlushStoredInteger(RGC,arr,s)
//! define Freer(arr,s) FlushStoredReal(RGC,arr,s)
//! define Frees(arr,s) FlushStoredString(RGC,arr,s)
//! define Freeb(arr,s) FlushStoredBoolean(RGC,arr,s)
//! define IsI(arr,s) HaveStoredInteger(RGC,arr,s)
//! define IsR(arr,s) HaveStoredReal(RGC,arr,s)
//! define IsS(arr,s) HaveStoredString(RGC,arr,s)
//! define IsB(arr,s) HaveStoredBoolean(RGC,arr,s)
//! define If(b) if(b)then
function SetHandle takes string arr,string s,handle val returns nothing
local integer I
local handle H=val
call SetInt(arr,s,I)
set I=0
endfunction
function SetCode takes string arr,string s,code val returns nothing
local integer I
local code C=val
call SetInt(arr,s,I)
set I=0
endfunction
function GetCode takes string arr,string s returns code
return GetInt(arr,s)
return null
endfunction
function GetUnit takes string arr,string s returns unit
return GetInt(arr,s)
return null
endfunction
function GetItem takes string arr,string s returns item
return GetInt(arr,s)
return null
endfunction
function GetDest takes string arr,string s returns destructable
return GetInt(arr,s)
return null
endfunction
function GetGroup takes string arr,string s returns group
return GetInt(arr,s)
return null
endfunction
function GetTimer takes string arr,string s returns timer
return GetInt(arr,s)
return null
endfunction
function GetTd takes string arr,string s returns timerdialog
return GetInt(arr,s)
return null
endfunction
function GetTrigger takes string arr,string s returns trigger
return GetInt(arr,s)
return null
endfunction
function GetTc takes string arr,string s returns triggercondition
return GetInt(arr,s)
return null
endfunction
function GetEffect takes string arr,string s returns effect
return GetInt(arr,s)
return null
endfunction
function GetLightning takes string arr,string s returns lightning
return GetInt(arr,s)
return null
endfunction
function GetBoolexpr takes string arr,string s returns boolexpr
return GetInt(arr,s)
return null
endfunction[/codes]
后面的Get各种的东西不是特别需要,我也没有添加全....

以下是模板。
[codes=jass]globals
trigger Damage_trigger
group Damage_group
endglobals
//! define Damage_maxN 750
function Damage_trg takes string s,conditionfunc c returns nothing
local trigger t
if(not IsI(s,"trigger"))then
    set t=CreateTrigger()
    call SetHandle(s,"trigger",t)
    call SetHandle(s,"condition",c)
    call SetHandle(s,"triggerc",TriggerAddCondition(t,c))
    call SetHandle(s,"group",CreateGroup())
endif
set t=null
endfunction
function Damage_gro takes nothing returns nothing
local unit u=GetEnumUnit()
If(GetUnitState(u,UNIT_STATE_LIFE)>0)
    call TriggerRegisterUnitEvent(Damage_trigger,u,EVENT_UNIT_DAMAGED)
    call GroupAddUnit(Damage_group,u)
endif
set u=null
endfunction
function Damage_Remtrg takes string s returns nothing
local trigger T
local integer I=GetInt(s,"trigger")
If(I!=0)
    call TriggerRemoveCondition(T,GetTc(s,"triggerc"))
    call DestroyTrigger(T)
    call DestroyGroup(GetGroup(s,"group"))
    call FreeString(s)
endif
set I=0
endfunction
function Damage_trg1 takes string s,group g returns nothing
local trigger t=GetTrigger(s,"trigger")
call TriggerRemoveCondition(t,GetTc(s,"triggerc"))
call DestroyTrigger(t)
set Damage_trigger=CreateTrigger()
set Damage_group=CreateGroup()
call ForGroup(g,function Damage_gro)
call DestroyGroup(g)
call SetHandle(s,"triggerc",TriggerAddCondition(Damage_trigger,GetBoolexpr(s,"condition")))
call SetHandle(s,"trigger",Damage_trigger)
call SetHandle(s,"group",Damage_group)
set t=null
endfunction
function Damage_AddUnit takes string s,unit u returns nothing
local trigger T
local integer I=GetInt(s,"trigger")
local group g
local integer maxN
If(I!=0)
    set g=GetGroup(s,"group")
    If(not IsUnitInGroup(u,g) and g!=null)
        set maxN=GetInt(s,"maxN")
        call GroupAddUnit(g,u)
        if(maxN<Damage_maxN)then
            call TriggerRegisterUnitEvent(T,u,EVENT_UNIT_DAMAGED)
            call SetInt(s,"maxN",maxN+1)
        else
            call Damage_trg1(s,g)
            call SetInt(s,"maxN",0)
        endif
    endif
endif
set I=0
set g=null
endfunction[/codes]
没什么创新的地方。
演示里面有6个不同的技能,分别是
1,魅惑魔女&#160; &#160;&#160; 推进
2,熊猫喷后眩晕单位
3,隐形刺客&#160; &#160;&#160; 背刺
4,裂魂人&#160; &#160; &#160;&#160; 巨力重击
5,幻影长矛手&#160;&#160; 并列
6,WOW牧师&#160; &#160; 真言术:盾
当然,都是山寨的,使用的同一个模板,起码以后做这一类的技能可以简单一些。
编辑器是Wehepler,大家自己看看演示吧,觉得有用的同学就收着吧。
没什么详细的介绍,此贴我修改了多次,全都删了。

UnitGetDamage.rar

1 KB, 下载次数: 46

函数模板

Date .w3x

46 KB, 下载次数: 69

六个技能演示

评分

参与人数 1威望 +5 收起 理由
eff + 5 原创演示

查看全部评分

 楼主| 发表于 2008-12-5 16:24:55 | 显示全部楼层
哦,说下函数的调用吧。
生成触发使用
[codes=jass]call Damage_trg(string,conditionfunc)[/codes]
这个string是用来存储函数等信息的,conditionfunc就是需要大家自己编写的动作,由于本人的pjass的检查器是比较老的版本了,必需得返回个boolean,大家可以忽略之。
[codes=jass]call Damage_AddUnit(string,unit)][/codes]
这个string同上,unit就是要给触发添加的单位,模板可以自己判断这个单位是否已经添加了,大家也可以在调用它之前多一些合理的判断,减少一些调用次数来节省资源。
[codes=jass]//! define Damage_maxN 500[/codes]
这个大家根据自己意愿或者习惯改就可以了,销毁和创建函数模板自己做就可以了。
回复

使用道具 举报

 楼主| 发表于 2008-12-8 11:06:26 | 显示全部楼层

自己顶自己一下吧...

昨天试验了一下Dota中的背刺的效果,地图的文件名为DotA Allstars v6.54b AI CN.w3x。
我不清楚该娱乐版是使用了Dota原版中的哪个版本,此贴就只说这一个,错了大家给我提醒下吧。

背刺是隐形刺客的技能,描述是从单位的背后攻击会造成与敏捷相关的额外伤害。而我所试验的效果是,改版本中的背刺的触发效果并不准确,一个简单的方法就是你在一个单位背后攻击一次,在一定时间内和你不受攻击的前提下,你可以通过攻击任意单位任意方向而触发背刺的效果。

在我所发的演示中,背刺是有一个另外的Bug,就是它无法准确的辨认物理和魔法以及道具的攻击,现在我改变了一下,给拥有背刺技能的单位添加一个法球的效果(演示中是腐蚀只球的效果),好处是可以完全准确的捕捉背刺,缺点是此被动技能不幸变成了法球技能。

若是我的话,在地图中的处理方法只能是将改技能绑定在特定的武器上了,比如匕首,然后限定单位只能持有单个武器。当然,这不符合Dota的限定,所以我也同样的认为,Dota不这样做是因为考虑到其他方面的原因,而不仅仅是技术方面的问题。一个大工程的细微改动总是会极大的影响整体的效果,而在演示中则完全不需考虑。

现在呢,演示中所有的技能可以说是暂时没有发现任何Bug了,最后更新下本贴,顺便顶到最上面,再没人看我就!@#¥%……了。

地图在顶楼更新!
回复

使用道具 举报

 楼主| 发表于 2008-12-8 11:10:06 | 显示全部楼层
哦,补充下,目前只有个别效果支持多人(其实就只有剑圣的分身),支持多人的方法很简单,触发中判断伤害来源是不是已经定义好了的单位,而大家可以创建一个单位组,来判断伤害来源是否属于单位组,同时在将其添加进单位组的同时别忘了给(单位发动技能效果)(单位获取攻击目标)之类的触发里面添加个事件就好了,嗯,很简单的。
回复

使用道具 举报

发表于 2008-12-8 11:58:22 | 显示全部楼层
其实背刺这类特定情况允许打出的被动技能大可以用真技能来做,在出手时判断方向,用工程升级替换技能
可以选择的被动技能面要广得多,比起单纯只有伤害,用被攻击事件来触发来说

至于区分打击“物理”伤害的话,一个方法是“背刺”用一个微量伤害的技能来做标记(比如附加0.001伤害的致命一击,0.999倍粉碎),从伤害值的精确度入手。一般来说普通的技能伤害和触发技能伤害没必要用到小数点后4位以上的数值吧
回复

使用道具 举报

 楼主| 发表于 2008-12-8 12:29:35 | 显示全部楼层
引用第4楼kook于2008-12-08 11:58发表的  :
其实背刺这类特定情况允许打出的被动技能大可以用真技能来做,在出手时判断方向,用工程升级替换技能
可以选择的被动技能面要广得多,比起单纯只有伤害,用被攻击事件来触发来说

至于区分打击“物理”伤害的话,一个方法是“背刺”用一个微量伤害的技能来做标记(比如附加0.001伤害的致命一击,0.999倍粉碎),从伤害值的精确度入手。一般来说普通的技能伤害和触发技能伤害没必要用到小数点后4位以上的数值吧

嗯。首先说下技能的替换吧,先判定条件再添加或替换技能,与判定条件再直接造成伤害,我觉得繁琐程度应该是相当的吧。而且对于”巨力重击“这个技能是不能简单使用一个被动技能来处理的,既然可以使用同一模板,这样我使用同一思路做下来,也是比较方便的。

而区分“物理”伤害使用数值的方法也有弊端,我在演示里面有个“真言术:盾”,有这个Buff的话,所有的伤害都会是0,难道有这个Buff存在就可以免疫背刺么?这个不是很好的处理方法吧。
回复

使用道具 举报

发表于 2008-12-8 13:37:39 | 显示全部楼层
灵魂锁链+反魔法盾组合的盾在多人释放下会有问题,没法控制分担伤害
回复

使用道具 举报

 楼主| 发表于 2008-12-8 13:59:12 | 显示全部楼层
确实确实
我之前都不知道灵魂锁链有这样的特性,嗯,给我点时间,我修改下吧
回复

使用道具 举报

 楼主| 发表于 2008-12-8 16:22:59 | 显示全部楼层
唉,不会改不会改...
如果玩家所有单位里面只有一个有“盾”的话是没问题的,因为灵魂锁链不会把伤害分摊都其他单位身上,所以之前的办法就必需得有这个限制了。

另一个办法就是受伤害加血了,回到更老的办法了....
这里把改成这样的发一下吧,限制50%生命值以下才可以释放,是因为血不会加到超过上限...[s:186]
另外,改用这个方法的话,Kook的办法就是可行的了,而且好处是不需要占用一个法球效果了,我暂时先不改了吧就,不知道这个盾还有什么别的好的方法没。

自然,实现方法归方法,模板还是归模板,话说我发帖子就是想把这个模板共享下,接受伤害这个事件应该是最准确的判断方法了,模板就是把生成触发这个工作简化一下。这些技能也只是随便写了下,只是没想到这个“盾”会这么麻烦。

Date .w3x

45 KB, 下载次数: 30

修改了“盾”这个技能,方法更渣了...

回复

使用道具 举报

发表于 2008-12-8 16:32:06 | 显示全部楼层
支持哦
可以移植多人游戏里用吗
回复

使用道具 举报

 楼主| 发表于 2008-12-8 16:35:38 | 显示全部楼层

Re:一个XX

引用第9楼1234512于2008-12-08 16:32发表的  :
支持哦
可以移植多人游戏里用吗

饿....很惭愧啊,这个因为只是演示,我觉得你所能用到就只有一个模板而已,其他做的技能你要用的话需要修改才能支持多人。
回复

使用道具 举报

发表于 2008-12-8 16:45:26 | 显示全部楼层
伸手族,不会改,忽忽
回复

使用道具 举报

 楼主| 发表于 2008-12-8 16:56:48 | 显示全部楼层
引用第11楼1234512于2008-12-08 16:45发表的  :
伸手族,不会改,忽忽

试试吧,其实不难的。而且光移植别人的而不自己做的话可是不行的。
回复

使用道具 举报

发表于 2008-12-8 17:06:51 | 显示全部楼层
没注释完全看不懂,另外我用的WOW吧第二版,还不能运行你的盾牌修改版,这个也有兼容问题吗,云了
回复

使用道具 举报

 楼主| 发表于 2008-12-8 18:20:59 | 显示全部楼层
哦  抱歉刚才出去了下
别的没什么问题的
主要就是看 //! define
这样的语句它是不是识别,不行的话,演示里面就是一大堆的未注册函数了.
回复

使用道具 举报

发表于 2008-12-8 18:39:01 | 显示全部楼层
似乎是识别不了的意思?譬如

//! import UnitGetDamage

提示:找不到UnitGetDamage
回复

使用道具 举报

 楼主| 发表于 2008-12-8 18:44:09 | 显示全部楼层
哦  这个。
你得先把顶楼的rar文件下载后解压到一个合适的目录,WOW8的我不知道是哪个,不过你可以在里面找到一个Return bug的通用模板,应该就是放到那个文件夹里面就可以了
回复

使用道具 举报

发表于 2008-12-8 19:02:17 | 显示全部楼层
没找到,试了几个文件嘉总算可以了
另外那个盾牌很喜欢,能否改改多人游戏中用啊,可以顶掉那个无敌了
回复

使用道具 举报

 楼主| 发表于 2008-12-8 19:37:18 | 显示全部楼层
嗯,在jineng6这个函数里面就是那个盾的技能,以修改后的那个来说吧,不过我得先说下它的Bug,就是单位满血的话,第一次的伤害是不能抵消的,因为它的工作原理就是在伤害到来之前给单位先加血,所以满血的话不能生效。在触发里面设置了单位的生命小于其上限的50%以后才可以对其使用,你可以自己调整下。嗯,是这个函数:
[codes=jass]function Hu takes player HU,string Hv returns nothing
local sound HV=CreateSoundFromLabel("InterfaceError",false,false,false,10,10)
if(GetLocalPlayer()==HU)then
if(Hv!="")and(Hv!=null)then
call ClearTextMessages()
call DisplayTimedTextToPlayer(HU,0,0,2.,"|cffffcc00"+Hv+"|r")
endif
call StartSound(HV)
endif
call KillSoundWhenDone(HV)
set HV=null
endfunction


function jineng6_trg takes nothing returns boolean
local integer I
local unit U=GetSpellTargetUnit()
//下面的‘A006’是我在演示里面的技能的ID,它的效果是给单位把“盾”这个效果带上,你可以换成别的技能,只要有魔法效果就可以了。同时记得在这里改下ID。
if(GetSpellAbilityId()=='A006')then
//下面这个就是限制50%血量的,若要更高的话可以自己改的。
    if(GetUnitState(U,UNIT_STATE_LIFE)/GetUnitState(U,UNIT_STATE_MAX_LIFE)<=.5)then
//这个是把技能释放单位添加进触发里面,你可以不用管它。
        call Damage_AddUnit("jineng6",U)
//这个里面的1000就是它能抵消的伤害,你也可以让它和技能等级,单位属性之类的数据挂钩,需要你自己修改。
        call SetReal("jineng6",I2S(I),1000)
    else
//下面的是如果单位的血量不符合要求的一些措施,你如果不在乎满血时出现的Bug的话,可以把else一下至endif之前的删掉,哦,还有上面的function Hu,也可以删了。
        set U=GetTriggerUnit()
        call PauseUnit(U,true)
        call Hu(GetOwningPlayer(U),"单位的生命值应低于50%。")
        call IssueImmediateOrderById(U, 851972)
        call PauseUnit(U,false)
    endif
endif
set I=0
return false
endfunction[/codes]
[codes=jass]function Hu[/codes]这个是我在Dota里面直接复制出来的,刚才时间匆忙。。。
它的作用是提示出错,只在释放"盾"这个技能的玩家面板上显示。
[codes=jass]function jineng6_trg[/codes]我已经把注释添加进去了。

[codes=jass]function InitTrig_jineng6 takes nothing returns nothing
local unit u=CreateUnit(Player(0),'Ulic',1000,-1000,0)
local trigger t=CreateTrigger()
call Damage_trg("jineng6",Condition(function jineng6_trg1))
call TriggerRegisterUnitEvent(t,u,EVENT_UNIT_SPELL_EFFECT)
call TriggerAddCondition(t,Condition(function jineng6_trg))
set u=null
set t=null
endfunction[/codes]这个是为拥有“盾”这个技能的单位添加的触发,他每次使用技能时,都会把套上盾的单位记录下来。
在演示里面我直接创建了单位,移植的话你可以把函数下第一行的单位创建,第四行的事件添加,删除掉。然后在你的地图里面要把这个函数变成一个需要传参的函数,嗯,jineng6这个函数你可以删掉,把里面的代码全部粘贴到//! import UnitGetDamage一下,同时函数变成[codes=jass]function jineng6_Add takes unit u returns nothing
local trigger t=CreateTrigger()
call Damage_trg("jineng6",Condition(function jineng6_trg1))
call TriggerRegisterUnitEvent(t,u,EVENT_UNIT_SPELL_EFFECT)
call TriggerAddCondition(t,Condition(function jineng6_trg))
set t=null
endfunction[/codes]基本上就可以了。自然包括自定义代码里面的//! import UnitGetDamage以上的所有代码。

需要说的是,以上我所说的都是一些基本的东西。做图东西其实还是自己写收益来的大,不然就是移植成功了以后遇到这类问题还是很难搞懂的。
回复

使用道具 举报

发表于 2008-12-8 20:35:52 | 显示全部楼层
恩,谢谢这么详细的说明
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-2 18:25 , Processed in 0.191232 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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