[WE] 部隊受傷觸發,Jass+Gui

看板WarCraft (魔獸爭霸 - 魔獸爭霸3)作者 (gyd style)時間18年前 (2007/05/06 18:39), 編輯推噓12(1202)
留言14則, 11人參與, 最新討論串1/1
我又來了,這次要教學的是部隊受傷當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

05/06 18:40, , 1F
這東西一直都是寫jass的主因,而用我的jass,完全不必寫到jass
05/06 18:40, 1F

05/06 19:07, , 2F
gj....不過剛從java抽身 晚點再看好了-_-
05/06 19:07, 2F

05/06 19:31, , 3F
05/06 19:31, 3F

05/06 20:56, , 4F
05/06 20:56, 4F

05/06 21:24, , 5F
大推,不過我看不懂XD
05/06 21:24, 5F

05/06 21:48, , 6F
推。
05/06 21:48, 6F

05/06 22:39, , 7F
05/06 22:39, 7F

05/06 22:59, , 8F
不懂但推
05/06 22:59, 8F

05/06 23:05, , 9F
05/06 23:05, 9F

05/06 23:51, , 10F
問一下 這類的東西都直接複製貼上就可以了嗎?
05/06 23:51, 10F

05/07 00:54, , 11F
不要天真了,孩子 囧
05/07 00:54, 11F
就是這麼天真

05/07 02:01, , 12F
囧...那還是要自己去寫啥JASS喔= =
05/07 02:01, 12F

05/07 02:22, , 13F
樓樓上的...這句話是啥意思 再來是Jass部分,一樣是貼上
05/07 02:22, 13F
的確是不用寫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版才更新就是了) 有問題歡迎找碴

05/07 02:47, , 14F
....不懂程式也是硬要推
05/07 02:47, 14F
※ 編輯: gyd 來自: 218.171.58.70 (05/07 12:16)
文章代碼(AID): #16FR1bqZ (WarCraft)
文章代碼(AID): #16FR1bqZ (WarCraft)