Tổng Hợp Spell - (Chỉ dành riêng cho Spell và cách làm Spell )

Status
Không mở trả lời sau này.
có ai chỉ tui cách lấy cái dòng đính lên trang này ko ( tại ở nhà có mấy con thay cung hay hay (nhưng ma những cai skill thường ko MUI đựơc)
 
Nhận xét sau khi xem qua trigger:
- ko MUI
- Leaks:
+ Locations:




Cứ mỗi 0.01s leak 4 location này 8-}

+ Group:




Như trên, cứ 0.01s leak 2 group (chả biết tốn bao nhiêu bộ nhớ nhưng... :| ko hề vớ vẩn)

Ngoài ra:

global variables ko cần phải null

Tắt, bật collides của unit trước và sau khi deal damage để làm gì ?
----
Và trigger kiểu này, unit 1 cast, chưa xong, unit 2 cast thì các rìu của unit 1 cast sẽ bị remove ? tức là WE của unit 1 sẽ bị dừng ?


Thanks nha anh Tom
He he
Em làm được mừng quýnh rồi nên chả cần chú ý chi hết. chỉ nói được vì vui sướng ha ha...
Chủ yếu của map này là Công Thức Ý:
Còn cái cuối cùng anh nói.. đó là cách đối phó trẻ con của em :D =))
____________

Bây giờ sẽ giải thích sơ nhé các bạn:

++++++++++++Đầu tiên++++++++++++
Sử dụng hàm số sin(x) để làm cho mấy cây búa thụt ra thụt vô...
như sau:

===== với sin(x) là một hàm tuần hoàn ... nói vậy không ai hiểu... cụ thể củ chuối là... thay giá trị của x từ 1 => 180 thì bạn sẽ thấy sin(x) cho kết quả đối xứng nhau. như thế gọi là tuần hoàn , hay đại loại như vậy :D.
VD : sin(180) = 0 ; sin(0) = 0 ; sin(90) = 1...
Giờ nhiệm vụ của ta là làm thế nào để "x" chạy từ 0 đến 180
Có nhiều cách lắm

Nếu là = trigger thì hướng dẫn như bên dưới có vẻ hiểu.

Đầu tiên bên trigger thường.
khi một unit cast spell thì
đặt một value( giá trị ) cho biến Counter(Type = Integer) bằng 0.
Rồi bên trigger thứ 2, cái mà dùng để move cây búa ấy
đặt cho Counter = Counter + 1.
làm như vậy để là gì nhỉ... à.. có thể cườn điệu việc này = nhiều cách khác nữa nhưng với trigger thì không thể thiếu cái này dươc

Giờ các bạn xem lại một trong 2 cái trigger WE Action cuả mình ấy
thay vì sét cho Counter Giá trị thì mình sét cho IntInt2 giá trị. cũng tương tự mà thôi

Mã:
Unit - Move Ball_1 instantly to (TempLoc offset by ([B]Distance[/B] x [B](Sin((1.00 x (Real(Int)))[/B]))) towards Angle1 degrees), facing Angle1 degrees
Set [I]Int [/I]= [U](Int + 1)[/U]
Set [I]Angle1[/I] = [U](Angle1 + 0.30)[/U]

Chú ý đên cái đống In đậm nhé.
Như giải thích ở trên thì như thế này
Hàm số Sin( 1.00 x (Real(Int))).
Cái yếu tố phụ này ko thể thiếu đâu nhé.

Hàm số trên chắc hầu như ai từng xem qua chiêu Toss của anh Tom_Kazansky chắc đều biết. Có chạy lưu động từ 0 => 1 rồi => 0 . Bởi vậy khi Distance x sin(...) thì nó sẽ có nhiều giá trị khác nhau từ nhỏ nhất lên cao nhất rồi lại nhỏ nhất. Như vậy là làm tôi làm được cái bứớc di chuyển unit ra vào. Nếu nói không chưa đủ. các bạn phải vùa bật WE lên vừa làm nhé. Nhưng tài giải thích mình tệ lắm. Vì thế nếu không hiểu hãy cầm máy tính lên. và ngồi bên Vi Tính vừa bấm vừa click chuột để làm.

====
Quan trọng nhất.
Như các bạn thấy ở 2 trigger WE Action 1 & 2 của mình . Để giá trị Int & Int2 chạy từ 0 - 180.
Đến khi Int & Int2 = 180 thì ngừng
Thôi giải thích một cái. cái kia làm đối xứng cái đầu.:hug:
Hãy chú ý đến giá trị Angle1 và Angle2. Ban đầu mình để
Angle1 = Vị trí Từ (A => B) + 27 độ
(Ngược lại Angle 2 trừ 27 độ)
Hãy chú ý tiếp đến trigger thứ 2 hay 3 gì đó.
Thế cái Set Angle1 = (Angle1 + 0.30) như thế nhé.
Vì sao.
Giải thích. Lúc đầu bắn búa ra búa 1 sẽ đi một góc lệch 27 độ bđầu so với góc từ A->B. Khi đó ta cần một cái gì đó kéo cay búa lại đúng dương từ đó xuất ra lệnh set Angle = ... đó.
Nghĩa là. theo lý thuyết nếu không có lệnh trên thì cây búa sẽ đi thẳng đến một độ dài nào đo = Distance (Xem lại Trigger WE Begin) :((|Khó nói quá|:(( rồi quay trở lại. Nhưng nhờ lệnh đó thì Cay cây búa sẽ bị làm đi theo dúng hướng nhắm tới. 180 lần thây đổi. Chia ra 2 nghĩa là sẽ có 90 lần unit sẽ hướng về phía trước . 90 lần sau Unit búa sẽ đi lùi.
Vì thế (éc éc) trong 90 lần đầu Cứ một lần Góc Angle sẽ đổi hứớng 0.3 độ. (0.3 x 90 = 27 độ) như vậy là nó về dươc đung hướng. tương tự ở 90 lần sau. ( Không biết hiểu không nữa) nhưng đến đó là hết rồi :devil:.

P/S : Bà con thông cảm nha. Tui khổng phải dân chuyên văn
 
có ai chỉ tui cách lấy cái dòng đính lên trang này ko ( tại ở nhà có mấy con thay cung hay hay (nhưng ma những cai skill thường ko MUI đựơc)

Khi gữi bài nhìn xuống dưới chút phần Thêm tuỳ chọn phụ
Có chứ File gữi kèm đ1
 
Các anh chị có ai biêt' cách tạo skill Freezing Field của Rylai trong DOTA không em tạo mà sai hoài ai biết xin gửi về email [email protected] em cám ơn nhìu.Em mới học làm skill nên thiếu hiểu biết mong các anh chị chỉ bảo thêm.:D
 
Freezing Field??. Đây:
- TẠo skill frost nova dummy có target là self.
- TẠo cái dummy <= model nào đó (nghi là cái model nhỏ wá => frost nova nhin effect cung bé tẹo hay là dùng none thì se ko có cái wái jì cả nên dùng trigger tạo effect cho nó gọn :'>)
- Làm cái skil channel đưa cho thèng tướng nó xài. Nhớ là có cái ji đó nó phải víible mới có icon để xài.
- Làm 1 trigger create randon dummy rui ỏder nó cast frost nova vào ngưới nó. (lưu ý là chỉ có AOE damage của frost nova là damage enemy thui nhé)
- Xong (có jì ko hỉu cũng chịu thui <= (điểm văn kém lén :'>))
 
em post lên đây cái Wild Axe làm bằng Jass do Ejmir làm ai không hiểu thì đừng hỏi em vì em có làm đâu post cho mọi người tham khảo thôi !!!
Mã:
scope WildAxes

//******************************************************************************************
//*
//*  Wild Axes - By emjlr3, Original seen in DotA Allstars
//*
//*  Hurl two axes outward, which then intersect and return. Each axe can 
//*  only damage a unit once and destroys trees in its wake. 
//* 
//*  Requires:
//*    - "TT" trigger copied to your map, if not already there
//*    - The "Wild Axes" ability copied to your map
//*    - The "Wild Axes" unit copied to your map
//*    - A vJASS Preprocessor
//*
//******************************************************************************************

globals
    // Config. Globals:
    private constant integer abil_id = 'A07E' // Wild Axes ability rawcode
    private constant integer dummy_id = 'e007' // Wild Axes unit rawcode
    private constant real speed = .028 // Speed for axes, this is an arbitrary value, increasing it increases the axes speed, while decreasing it decreases their speed
    private constant real width = 375. // Width for bezier curve, larger values give a wider arc, and vice versa
    private constant real area = 150. // Area to damage units around axes and destroy trees
    private constant string sfx = "Objects\\Spawnmodels\\Human\\HumanBlood\\BloodElfSpellThiefBlood.mdl" // Effect created on hit units
    private constant attacktype attack_type = ATTACK_TYPE_HERO // Attack type for damage
    private constant damagetype damage_type = DAMAGE_TYPE_NORMAL // Damage type for damage
    
    // Needed Globals:
    public trigger Trigger = null // Output trigger will be WildAxes_Trigger, which can be used publically
    private group G = CreateGroup()
    private group TempG = null
    private player P = null
    private location L = null
    private rect R = null
endglobals
// Config. Functions:
private function Damage takes integer lvl returns real
    return 60.+(lvl*30.) // Damage/lvl
endfunction

private struct data
    unit u
    unit axe
    player p
    group grp
    real x
    real y
    real xl
    real yl
    real a = 1.
    real outx
    real outy
    real ang
    integer lvl
    boolean first = true
endstruct

private function Conditions takes nothing returns boolean
    return GetSpellAbilityId()==abil_id
endfunction
private function Filt takes nothing returns boolean
    return not IsUnitInGroup(GetFilterUnit(),TempG) and GetWidgetLife(GetFilterUnit())>.405 and not IsUnitType(GetFilterUnit(),UNIT_TYPE_STRUCTURE) and IsUnitEnemy(GetFilterUnit(),P)
endfunction
private function Kill_Trees takes nothing returns nothing
	call KillDestructable(GetEnumDestructable())
endfunction
private function Effects takes unit u, real x, real y, group grp, integer lvl returns nothing
    local unit dum
    
    set R = Rect(x-150.,y-150.,x+150.,y+150.)
    call EnumDestructablesInRect(R,null,function Kill_Trees)
    call GroupClear(G)
    set P = GetOwningPlayer(u)
    set TempG = grp
    call GroupEnumUnitsInRange(G,x,y,area,Condition(function Filt))
    loop
        set dum = FirstOfGroup(G)
        exitwhen dum==null
        call GroupRemoveUnit(G,dum)
        call UnitDamageTarget(u,dum,Damage(lvl),false,false,attack_type,damage_type,null)
        call DestroyEffect(AddSpecialEffectTarget(sfx,dum,"chest"))
        call GroupAddUnit(grp,dum)
    endloop
endfunction
private function Movement takes nothing returns boolean
    local data d = TT_GetData()
    local real b = 1.-d.a
    
    call SetUnitX(d.axe,d.x*d.a*d.a+d.outx*2*d.a*b+d.xl*b*b)
	call SetUnitY(d.axe,d.y*d.a*d.a+d.outy*2*d.a*b+d.yl*b*b)
    call Effects(d.u,GetUnitX(d.axe),GetUnitY(d.axe),d.grp,d.lvl)
    if d.first then
		set d.a = d.a-speed
	else
		set d.a = d.a+speed
		set d.x = GetUnitX(d.u)
		set d.y = GetUnitY(d.u)
	endif
    if d.a<0. and d.first then
		set d.first = false
		set d.outx = d.x+width*Cos(Atan2(d.yl-d.y,d.xl-d.x)+d.ang)
        set d.outy = d.y+width*Sin(Atan2(d.yl-d.y,d.xl-d.x)+d.ang)
	endif
    if d.a>1. and d.first==false then
		call DestroyGroup(d.grp)
		call RemoveUnit(d.axe)
		call d.destroy()
        return true
	endif
    return false
endfunction
private function Actions takes nothing returns nothing
    local data d1 = data.create()
    local data d2 = data.create()
    
    set d1.u = GetTriggerUnit()
    set d2.u = d1.u
    set d1.x = GetUnitX(d1.u)
    set d2.x = d1.x
    set d1.y = GetUnitY(d1.u)
    set d2.y = d1.y
    set d1.p = GetOwningPlayer(d1.u)
    set d2.p = d1.p
    set d1.axe = CreateUnit(d1.p,dummy_id,d1.x,d1.y,0.)
    set d2.axe = CreateUnit(d1.p,dummy_id,d1.x,d1.y,0.)
    set d1.grp = CreateGroup()
    set d2.grp = CreateGroup()
    set d1.lvl = GetUnitAbilityLevel(d1.u,abil_id)
    set d2.lvl = d1.lvl
    set L = GetSpellTargetLoc()
    set d1.xl = GetLocationX(L)
    set d2.xl = d1.xl
    set d1.yl = GetLocationY(L)
    set d2.yl = d1.yl
    
    set d1.outx = d1.x+width*Cos(Atan2(d1.yl-d1.y,d1.xl-d1.x)+45.)
    set d1.outy = d1.y+width*Sin(Atan2(d1.yl-d1.y,d1.xl-d1.x)+45.)
    set d2.outx = d1.x+width*Cos(Atan2(d1.yl-d1.y,d1.xl-d1.x)-45.)
    set d2.outy = d1.y+width*Sin(Atan2(d1.yl-d1.y,d1.xl-d1.x)-45.)
    set d1.ang = -45.
    set d2.ang = 45.
    
    call TT_Start(function Movement,d1)
    call TT_Start(function Movement,d2)
    
    call RemoveLocation(L)
endfunction

//===========================================================================
public function InitTrig takes nothing returns nothing
    set Trigger = CreateTrigger( )
    call TriggerRegisterAnyUnitEventBJ( Trigger, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( Trigger, Condition( function Conditions ) )
    call TriggerAddAction( Trigger, function Actions )
endfunction

endscope
 
Freezing Field??. Đây:
- TẠo skill frost nova dummy có target là self.
- TẠo cái dummy <= model nào đó (nghi là cái model nhỏ wá => frost nova nhin effect cung bé tẹo hay là dùng none thì se ko có cái wái jì cả nên dùng trigger tạo effect cho nó gọn )
- Làm cái skil channel đưa cho thèng tướng nó xài. Nhớ là có cái ji đó nó phải víible mới có icon để xài.
- Làm 1 trigger create randon dummy rui ỏder nó cast frost nova vào ngưới nó. (lưu ý là chỉ có AOE damage của frost nova là damage enemy thui nhé)
- Xong (có jì ko hỉu cũng chịu thui <= (điểm văn kém lén ))
__________________
Èo em mới chỉ là gà con mới chỉ sáng tạo spell bằng cách chuyển đổi hình dáng của missile thui à + thêm vài cài linh tinh nữa chứ cái này thì hơi khó :D thui dù sao cũng cảm ơn nhiều để em diza` ôm cài máy mò suốt đêm vậy :D em thích mấy cái phép thể loại băng nên thấy cái nào cool là em muôn học hết không biết có làm được hay không nhưng cũng đáng để thử chứ:D thank nhìu
 
Tạm thời mình sẽ nghi làm Spell một thời gian nhưng bà con cứ hoạt động tiếp nhé |I hope so |
Tuy nghỉ nhưng sẽ ghế vào đây mỗi chủ nhật để hướng dẫn đôi chút :D
 
Freezing Field??. Đây:
- TẠo skill frost nova dummy có target là self.
- TẠo cái dummy <= model nào đó (nghi là cái model nhỏ wá => frost nova nhin effect cung bé tẹo hay là dùng none thì se ko có cái wái jì cả nên dùng trigger tạo effect cho nó gọn :'>)
- Làm cái skil channel đưa cho thèng tướng nó xài. Nhớ là có cái ji đó nó phải víible mới có icon để xài.
- Làm 1 trigger create randon dummy rui ỏder nó cast frost nova vào ngưới nó. (lưu ý là chỉ có AOE damage của frost nova là damage enemy thui nhé)
- Xong (có jì ko hỉu cũng chịu thui <= (điểm văn kém lén :'>))

Nếu làm như thế này thì khi create effect rồi destroy sẽ để lại một đống vụn băng nho nhỏ, mất một lúc mới biến mất T_T. Download map của vexorian ấy, trong đó có một model dummy, ko nhìn thấy gì nhưng có origin, overhead và chest attachment đủ cả. Với cả nếu tạo một unit mà ko phải locust, khi ấn alt để show health bar thì sẽ thấy chi chít health bar nhỏ tí trên màn hình, ko đẹp T_T. Nói chung là làm thế này, tạo các dummy neutral có ability ghost rồi tạo dummy của mình để cast Frost Nova lên mấy neutral dummy kia. Trừ khi bọn còn lại có gem chứ ko thì nhìn bằng mắt :)). Tiện thể để máu của neutral dummy là 1 để trúng Frost Nova thì chết luôn, đỡ phải lo duration buff :))
 
Ah` có anh chị nào biết cách tạo skill Eclipse của con lunar moonfang trong DOTA không bày em cách tạo vớt:D(hy vọng sớm nhận được trả lời vì em đang bí làm spell 1 hồi muốn điên luôn :D)
 
Status
Không mở trả lời sau này.
Back
Top