作者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
→ gyd:這東西一直都是寫jass的主因,而用我的jass,完全不必寫到jass 05/06 18:40
→ justagame:gj....不過剛從java抽身 晚點再看好了-_- 05/06 19:07
推 greelate:推 05/06 19:31
推 BlueLex:推 05/06 20:56
推 wix3000:大推,不過我看不懂XD 05/06 21:24
推 gonzdevour:推。 05/06 21:48
推 SvcChaos:推 05/06 22:39
推 fni653:不懂但推 05/06 22:59
推 wu2183:推 05/06 23:05
推 kevin31723:問一下 這類的東西都直接複製貼上就可以了嗎? 05/06 23:51
推 wix3000:不要天真了,孩子 囧 05/07 00:54
就是這麼天真
推 kevin31723:囧...那還是要自己去寫啥JASS喔= = 05/07 02:01
推 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版才更新就是了)
有問題歡迎找碴
推 yybear:....不懂程式也是硬要推 05/07 02:47
※ 編輯: gyd 來自: 218.171.58.70 (05/07 12:16)