作者gyd (gyd style)
看板WarCraft
标题[WE] 部队受伤触发,Jass+Gui
时间Sun May 6 18:39:32 2007
我又来了,这次要教学的是部队受伤当event的触发
目的:
1.event不会越来越肥
2.不必针对每一个技能另外写jass
举个例子
当曹仁放食腐群之後,被打到的人所受的伤会补到曹仁身上
如果在WE自学手册中,这玩意叫血波,作者是hobill
当一张地图中,有很多技能需要用到单体、多人的被伤害事件时,就需要写很多jass
用我的方法,就不必了,只需要贴Jass,然後记住使用规则
使用方法,拿我的雷神之怒来当例子,就需要写2个触发
第一个触发是当使用雷神之怒时触发
AngerOfLighting
event
unit 使技能生效
condition
(Ability being cast) 等於 雷神之怒
action
XXX
set tempCaster=(last created unit)
set tempTarget=target unit of ability being cast
set tempTrigger=AngerOfLightingSub<gen>
set tempInt=level of 雷神之怒 for Trigger unit
Custom Script:call DamagedEventTrigger()
然後是第2个
AngerOfLightingSub
event
condition
action
YYY
其中tempCaster是用来判断谁的攻击击中(或技能)时触发
tempTarget则是受伤时触发的部队
tempInt是用来存一些之後会用到的值(当然你可以自己增加)
tempTrigger是触发时需要执行的事,我的设计中是直接存成另一个触发
XXX是用来创造隐藏施法单位的code(也可以直接把tempCaster设成自己)
YYY是之後要跑的技能内容
也就是说,我的触发中,tempCaster是隐藏施法单位
tempTarget是第一只,也就是我瞄准的人
tempInt我存的是散开的雷电数量
tempTrigger为AngerOfLightingSub
XXX我是创一只单位放连锁打第一只(就是上面的tempCaster)
YYY则是处理产生打到之後散开的雷电
所以一共需要5个变数就可以处理,还外加一个Cache,这个东西需在地图一开始init
加这2句就可以了
Game Cache - Create a game cache from wowVer.w3v (wowVer.w3v可自己随便换名字)
set Cache = Last Created game cache
而每个技能拆成三部分
1.放技能的时候
2.受伤(这部份jass控制)
3.技能效果
Q1:范围技怎麽办?
A1:在1.中先抓出可能会被打到的人
然後pick every unit in unitgroup去做set tempTarget跟call DamagedEventTrigger()
Q2:在被呼叫的触发中,怎麽知道抓打人跟被打的部队?
A2:变数等同於部队受伤的事件,如Damage Source Unit等等
而被暂存的那个数字则一样叫作tempInt
再来是Jass部分,一样是贴上就好
使用前在地图中提到是Damaged Jass Powered by gyd会更感激
============================================================================
//damaged unit专用触发:DamagedEventTrigger()
function H2I takes handle h returns integer
return h
return 0
endfunction
function H2S takes handle h returns string
return I2S(H2I(h))
endfunction
function I2T takes integer i returns trigger
local trigger t
return i
return t
endfunction
//damaged unit专用触发:DamagedEventTrigger()
function DamagedEventTrigger_Actions takes nothing returns nothing
local string TrgingTrgStr = H2S(GetTriggeringTrigger())
//如果是因为死亡而触发,就删除这个触发
if ( H2I(GetDyingUnit()) != H2I(null)) then
call FlushStoredMission(udg_Cache, TrgingTrgStr)
call DestroyTrigger(GetTriggeringTrigger())
endif
//检验伤害来源是否为Caster
if ( H2I(GetEventDamageSource()) != GetStoredInteger( udg_Cache, TrgingTrgStr, "DETcaster" ) ) then
return
endif
//执行该执行的事
set udg_tempInt = GetStoredInteger( udg_Cache, TrgingTrgStr, "DETnum")
call TriggerExecute( I2T(GetStoredInteger( udg_Cache, TrgingTrgStr, "DETtrg" )) )
call FlushStoredMission(udg_Cache, TrgingTrgStr)
call DestroyTrigger(GetTriggeringTrigger())
endfunction
//=========================
function DamagedEventTrigger takes nothing returns nothing
local trigger tTrigger = CreateTrigger()
local string TrgingTrgStr = H2S(tTrigger)
call TriggerRegisterUnitEvent(tTrigger, udg_tempTarget, EVENT_UNIT_DAMAGED )
call TriggerRegisterUnitEvent(tTrigger, udg_tempTarget, EVENT_UNIT_DEATH )
call TriggerAddAction( tTrigger, function DamagedEventTrigger_Actions )
//在cache中存入 udg_tempCaster(等下要被当做caster),udg_tempTrigger(等下要被执行)
call StoreInteger( udg_Cache, TrgingTrgStr , "DETcaster", H2I( udg_tempCaster) )
call StoreInteger( udg_Cache, TrgingTrgStr , "DETtrg", H2I( udg_tempTrigger ) )
call StoreInteger( udg_Cache, TrgingTrgStr , "DETnum", udg_tempInt)
endfunction
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 218.171.58.70
1F:→ gyd:这东西一直都是写jass的主因,而用我的jass,完全不必写到jass 05/06 18:40
2F:→ justagame:gj....不过刚从java抽身 晚点再看好了-_- 05/06 19:07
3F:推 greelate:推 05/06 19:31
4F:推 BlueLex:推 05/06 20:56
5F:推 wix3000:大推,不过我看不懂XD 05/06 21:24
6F:推 gonzdevour:推。 05/06 21:48
7F:推 SvcChaos:推 05/06 22:39
8F:推 fni653:不懂但推 05/06 22:59
9F:推 wu2183:推 05/06 23:05
10F:推 kevin31723:问一下 这类的东西都直接复制贴上就可以了吗? 05/06 23:51
11F:推 wix3000:不要天真了,孩子 囧 05/07 00:54
就是这麽天真
12F:推 kevin31723:囧...那还是要自己去写啥JASS喔= = 05/07 02:01
13F:推 kevin31723:楼楼上的...这句话是啥意思 再来是Jass部分,一样是贴上 05/07 02:22
的确是不用写jass了
可是我在文章里提到的概念要懂
要自己把你的技能拆成2份,就可以直接套用
如果还有不懂,可以直接告诉我你想要怎样的技能效果
我可以直接套给你看
再强调一次,一般写这种需要用到部队受伤当事件的触发
如果想考虑到event越来越肥的处理
(解释一下,因为每次event一直加入不同部队,然後部队死了event还在)
就得自己写jass处理
而使用我的方法,只需要直接贴上jass,这部分的处理就可以直接交给jass作
当然这东西的使用方法不比前面的物品合成Jass+Gui
但还是可以把工夫省到完全不必自己另外写jass
我在发表上来之前,也测试过递回呼叫
譬如圣骑的复仇者之盾
在打到一个目标之後会再找下一个目标去打,弹9次
而在弹9次的动作中,我就是利用上面的东西来作的
直接在sub触发中自己把自己设成tempTrigger,damage source为tempCaster
然後从旁边抓出tempTarget及tempInt=tempInt-1再呼叫DamagedEventTrigger()
就直接达成盾在打到一个目标之後弹往下一个
(不过这东西我在1_08版才更新就是了)
有问题欢迎找碴
14F:推 yybear:....不懂程式也是硬要推 05/07 02:47
※ 编辑: gyd 来自: 218.171.58.70 (05/07 12:16)