精華區beta WarCraft 關於我們 聯絡資訊
我又來了,這次要教學的是部隊受傷當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)