^
Chuẩn!
Arrow PotM thì dùng system xecollider trong bộ xecast ấy,dễ lắm. Khung của nó là tạo 1 cái struct có 3 cái event khi chạm unit,khi hết thời gian và khi dummy chết.Mình gắn tọa độ ban đầu cho cái arrow,khi nó gặp unit địch thì tính thời gian stun dựa trên khoảng cách từ vị trí hiện tại so với tọa độ ban đầu -->stun thời gian tùy ý.Xong rồi thích thì giết con dummy luôn hoặc cho nó chạy tiếp thì tùy

.
Biết cách dùng cái system này thật vô cùng tiện lợi
Cấu trúc cho 1 dummy bay như sau :
[spoil]
Mã:
private struct [B]Arrow[/B] extends xecollider //Muon sua arrow thanh ten gi cung dc
unit owner
method [B]onUnitHit[/B] takes unit [B]target[/B] returns nothing
//Su kien xay ra khi cham 1 unit khac(target)
endmethod
method [B]onDestroy[/B] takes nothing returns nothing
//Su kien xay ra khi no bi tieu diet
set this.owner = null
endmethod
method [B]onExpire[/B] takes nothing returns nothing
//Su kien xay ra khi het thoi gian
call this.terminate() //-->dung de xoa cai cau truc nay cho do~ leak.
endmethod
endstruct
[/spoil]
Đầu tiên copy 4 cái trigger library Xe vào map,import model dummy vào,tạo 1 dummy với model đấy.Ấn ctrl D xem mã raw của dummy xong vào trigger xebasic sửa raw code dummy.
Sau đó tạo 1 skill target point ví dụ dựa trên crushing wave chẳng hạn,sửa tên,tooltip,mana,cooldown.Ném nó cho con PotM.<A000>
Tạo 1 skill stun cho dummy,xóa cái missile đi.<A001>
Tạo 1 trigger :
[spoil]
Mã:
Arrow
Events
Unit - A unit Starts the effect of an ability
Conditions
(Ability being cast) Equal to PotM Arrow
Actions
[/spoil]
Convert nó qua JASS,ta được :
[spoil]
Mã:
function Trig_Arrow_Conditions takes nothing returns boolean
if ( not ( GetSpellAbilityId() == 'A000' ) ) then
return false
endif
return true
endfunction
function Trig_Arrow_Actions takes nothing returns nothing
endfunction
//===========================================================================
function InitTrig_Arrow takes nothing returns nothing
set gg_trg_Arrow = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Arrow, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_Arrow, Condition( function Trig_Arrow_Conditions ) )
call TriggerAddAction( gg_trg_Arrow, function Trig_Arrow_Actions )
endfunction
[/spoil]
Dán cái struct kia vào trigger,ta được :
[spoil]
Mã:
function Trig_Arrow_Conditions takes nothing returns boolean
if ( not ( GetSpellAbilityId() == 'A000' ) ) then
return false
endif
return true
endfunction
[B]private struct Arrow extends xecollider
unit owner
method onUnitHit takes unit target returns nothing
endif
endmethod
method onDestroy takes nothing returns nothing
set this.owner = null
endmethod
method onExpire takes nothing returns nothing
call this.terminate()
endmethod
endstruct[/B]
function Trig_Arrow_Actions takes nothing returns nothing
endfunction
//===========================================================================
function InitTrig_Arrow takes nothing returns nothing
set gg_trg_Arrow = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Arrow, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_Arrow, Condition( function Trig_Arrow_Conditions ) )
call TriggerAddAction( gg_trg_Arrow, function Trig_Arrow_Actions )
endfunction
[/spoil]
Bây giờ sửa từng cái 1.
Đầu tiên là sửa cái struct arrow.
Thêm các biến sau vào
location loc // -->luu vi tri arrow luc dau
location loc2 //-->luu vi tri arrow luc cham target
real khoangcach//-->tinh khoang cach 2 vi tri kia
integer lv//-->Lv arrow
integer lvstun //tinh lv cho stun skill
Ở phần OnUnitHit mình sẽ tính lv cho skill stun của dummy như sau:
//Điều kiện là nếu target là kẻ thù của chủ dummy và nó còn sống thì mới check
if(IsUnitEnemy(target,GetOwningPlayer(owner)) and IsUnitAliveBJ(target))then
set loc2=GetUnitLoc(target)//->lưu vị trí target
set khoangcach = DistanceBetweenPoints(loc,loc2)//-->tính khoảng cách giữa 2 điểm
set lvstun = R2I(khoangcach/100)//tính lv stun dựa trên khoảng cách,R2I để convert 1 số Real qua Integer.
endif
Giờ struct của ta đã thành :
[spoil]
Mã:
private struct Arrow extends xecollider
unit owner
location loc // -->luu vi tri arrow luc dau
location loc2 //-->luu vi tri arrow luc cham target
real khoangcach//-->tinh khoang cach 2 vi tri kia
integer lv//-->Lv arrow
integer lvstun //tinh lv cho stun skill
method onUnitHit takes unit target returns nothing
if(IsUnitEnemy(target,GetOwningPlayer(owner)) and IsUnitAliveBJ(target))then
set loc2=GetUnitLoc(target)
set khoangcach = DistanceBetweenPoints(loc,loc2)
set lvstun = R2I(khoangcach/100)//vi du neu cu 100 range tang lv stun len 1
//neu lv >10 thi set no = 10,vi stun co 10 level
if(lvstun>10) then
set lvstun =10
endif
endif
endmethod
method onDestroy takes nothing returns nothing
set this.owner = null
endmethod
method onExpire takes nothing returns nothing
call this.terminate()
endmethod
endstruct
[/spoil]
Bây h để cho dummy cast stun vào target,với ai ko biết JASS thì làm như sau
Tạo 1 trigger mới :
[spoil]
Mã:
Untitled Trigger 001
Events
Conditions
Actions
Unit - Create 1 Dummy Unit for (Owner of (Triggering unit)) at (Center of (Playable map area)) facing Default building facing degrees
Unit - Add a 2.00 second Generic expiration timer to (Last created unit)
Unit - Add Storm Bolt to (Last created unit)
Unit - Set level of Storm Bolt for (Last created unit) to 1
Unit - Order (Last created unit) to Human Mountain King - Storm Bolt (Last created unit)
Unit - Cause (Triggering unit) to damage (Triggering unit), dealing 500.00 damage of attack type Spells and damage type Universal
[/spoil]
Convert nó qua jass dán vào phần OnUnitHit .
[spoil]
Mã:
call CreateNUnitsAtLoc( 1, 'n000', GetOwningPlayer(GetTriggerUnit()), GetRectCenter(GetPlayableMapRect()), bj_UNIT_FACING )
call UnitApplyTimedLifeBJ( 2.00, 'BTLF', GetLastCreatedUnit() )
call UnitAddAbilityBJ( 'AHtb', GetLastCreatedUnit() )
call SetUnitAbilityLevelSwapped( 'AHtb', GetLastCreatedUnit(), 1 )
call IssueTargetOrderBJ( GetLastCreatedUnit(), "thunderbolt", GetLastCreatedUnit() )
call UnitDamageTargetBJ( GetTriggerUnit(), GetTriggerUnit(), 500, ATTACK_TYPE_NORMAL,DAMAGE_TYPE_UNIVERSAL )
[/spoil]
Sửa : GetTriggerUnit() -->owner(chủ dummy)
Sửa : GetRectCenter(GetPlayableMapRect()) -->loc2-->vị trí target
AHtb->Sửa thành rawcode của skill stun của dummy,ví dụ ở demo map là A001 đó.
Sửa cái số 1 ở dòng set level -> lvstun
Sửa GetLastCreatedUnit() ở sau thành target.
Sửa dòng damage thành :
call UnitDamageTargetBJ( owner,target,75*lv, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_UNIVERSAL )
Nghĩa là cho owner damage target với sát thương 75 điểm mỗi level
Remove leak,ta được struct hoàn chỉnh:
[spoil]
Mã:
private struct Arrow extends xecollider
unit owner
location loc // -->luu vi tri arrow luc dau
location loc2 //-->luu vi tri arrow luc cham target
real khoangcach//-->tinh khoang cach 2 vi tri kia
integer lv//-->Lv arrow
integer lvstun //tinh lv cho stun skill
method onUnitHit takes unit target returns nothing
if(IsUnitEnemy(target,GetOwningPlayer(owner)) and IsUnitAliveBJ(target))then
set loc2=GetUnitLoc(target)
set khoangcach = DistanceBetweenPoints(loc,loc2)
set lvstun = R2I(khoangcach/100)//vi du neu cu 100 range tang lv stun len 1
if(lvstun>10) then
set lvstun =10
endif
call CreateNUnitsAtLoc( 1, 'n000', GetOwningPlayer(owner), loc2, bj_UNIT_FACING )
call UnitApplyTimedLifeBJ( 2.00, 'BTLF', GetLastCreatedUnit() )
call UnitAddAbilityBJ( 'A001', GetLastCreatedUnit() )
call SetUnitAbilityLevelSwapped( 'A001', GetLastCreatedUnit(), lvstun )
call IssueTargetOrderBJ( GetLastCreatedUnit(), "thunderbolt", target )
call UnitDamageTarget(owner,target,lv*75, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_UNIVERSAL )
call RemoveLocation(loc2)
set loc2 = null
endif
endmethod
method onDestroy takes nothing returns nothing
set this.owner = null
endmethod
method onExpire takes nothing returns nothing
call this.terminate()
endmethod
endstruct
[/spoil]
Cuối cùng ở phần action ta tạo con dummy đó như sau :
[spoil]
Mã:
local location loc = GetUnitLoc(GetTriggerUnit()) //-->Lay vi tri cua PotM
local location loc2 =GetSpellTargetLoc()//-->Lay vi tri cast spell
local real ang = AngleBetweenPoints(loc,loc2)//-->Lay huong bay cho arrow
local integer lv = GetUnitAbilityLevel(GetTriggerUnit(),'A000')//lay level skill arrow
local Arrow fx//bien thuoc kieu arrow o tren,ten la fx
set fx = Arrow.create(GetLocationX(loc), GetLocationY(loc), Deg2Rad(ang))
//tao 1 cai arrow o vi tri X,Y,quay ve phia' ang
//o day la vi tri cua potm,huong quay ve vi tri cast spell
set fx.fxpath = "Abilities\\Weapons\\Arrow\\ArrowMissile.mdl"
//model cho dummy,nam trong 2 dau "" ,nho la duong dan thi phai 2 dau \\
set fx.z=50.
//do cao dummy
set fx.speed = 700
//toc do dummy
set fx.scale = 2
//phong to dummy bao nhieu lan
set fx.expirationTime = 2
//dummy bay bao lau thi chet
set fx.owner = GetTriggerUnit()
//chu cua dummy la ai?
set fx.loc = loc
// bien nay moi tao them o tren,dung de luu vi tri arrow luc dau do'
set fx.lv = lv
//luu lv skill arrow
//Remove Leak
call RemoveLocation(loc)
set loc = null
call RemoveLocation(loc2)
set loc2 = null
[/spoil]
Xong,giờ thử sửa cast back wing + cast point của heroes về 0 xem cast liên tục có lag ko
Demo map :
http://www.mediafire.com/?cvluydtmmi0