Topic hỏi đáp về cách làm map | version 11

Status
Không mở trả lời sau này.
PHP:
private function Stop takes unit caster returns boolean
	local integer array Buff
	local integer i  //tick -> i, với vòng lặp thì cần gì đặt tên dài? nhg cái này tùy thôi, thấy cách nào "quen" hơn thì theo
	set Buff[0] = 'BSTN'
	set Buff[1] = 'BPSE'
	set Buff[2] = 'Bena'
	set Buff[3] = 'Bens'
	set Buff[4] = 'Beng'
	set Buff[5] = 'BEer'
	set Buff[6] = 'BUsl'
	set Buff[7] = 'BUsp'
	set Buff[8] = 'BUst'
	set Buff[9] = 'BNsi'
	set Buff[10] = 'BUsp'
	set Buff[11] = 'BOhx'
	set Buff[12] = 'BUim'
	set Buff[13] = 'Bcrs'
	set Buff[14] = 'BNso'

	set i = 0
	loop
		exitwhen i >14
		if GetUnitAbilityLevel(caster,Buff[i])>0 then
		    return false
		endif
		set i=i+1
	endloop
                   
    return true
endfunction

Đoạn code của Tom fix lại 1 tí, cho nó nhận vào 1 tham số unit caster, bỏ đi phần local unit caster

Bên kia function Action của bạn thêm vào if (Stop(caster)) -- truyền biến caster (là thằng casting đã lưu lại khi cast spell) ờ function Action này qua cho function Stop kia xử lí tiếp..
 
Attacking ( là thằng đánh ) khi attack vào Attacker ( là thằng bị đánh ) mất 100hp thì Attacking ( là thằng đánh ) phản lại mất 50hp là 50% bị phản lại
trong forum có ai làm đc kiểu buff ( GUI ) ý ko có thì send nên cho ae thực tập học hỏi kái
 
1 map có khoảng hơn 50 trigger với event là every (0.01 - 1) second of game time thì có gây lag không?
 
1 map có khoảng hơn 50 trigger với event là every (0.01 - 1) second of game time thì có gây lag không?
Nên 0,04 > 1 thì an toàn hơn, dưới 0,04 nghe bác Tom nói wa nhanh rất dễ gây lỗi :D
 
Mình không hỏi thời gian lặp lại, mình hỏi về số lượng trigger cơ.
 
1 map có khoảng hơn 50 trigger với event là every (0.01 - 1) second of game time thì có gây lag không?

Càng nhiều càng lag : Đơn giản
Nhưng mà hạn chế every time < 0.02s . Không thì nhấc chuột đi không nổi đấy
 
Kan đố mọi người nhé, 1 câu nho nhỏ thui nhưng sẽ giúp ích phần nào cho mọi người ^^

Dùng 1 Timer, xử lí 1000 câu lệnh
Dùng 10 Timer, mỗi Timer xử lí 100 câu lệnh

Giả sử cùng 1 con CPU chạy, hỏi cách nào là tốt nhất...
 
Ai có dạng tường này cho mình xin và chỉ mình cách import luôn, cần gấp gấp :| Kiểu của Loarderon Summer
1ba15794a4f6326e6cc0aaa0ff8eb9f1_35654847.v2.jpg
Quote lần 2, ai co dạng tường này cho mình xin gấp gấp :|
 
Cho em hỏi cái Trigger nay` bị Lỗi gì thế ??
//===========================================================================
// Trigger: Knockback Knife
//===========================================================================
function Trig_Knockback_Knife_Conditions takes nothing returns boolean
if ( not ( GetSpellAbilityId() == 'A005' ) ) then
return false
endif
return true
endfunction

function Trig_Knockback_Knife_Func002C takes nothing returns boolean
if ( not ( GetLearnedSkillBJ() == 'A005' ) ) then
return false
endif
return true
endfunction

function Trig_Knockback_Knife_Actions takes nothing returns nothing
call KnockbackTarget(GetSpellAbilityUnit() , GetSpellTargetUnit() , GetUnitFacing(GetSpellAbilityUnit()) , 250.00 , 5.00 , true , true , true)
 
Kan đố mọi người nhé, 1 câu nho nhỏ thui nhưng sẽ giúp ích phần nào cho mọi người ^^

Dùng 1 Timer, xử lí 1000 câu lệnh
Dùng 10 Timer, mỗi Timer xử lí 100 câu lệnh

Giả sử cùng 1 con CPU chạy, hỏi cách nào là tốt nhất...

cách 2! .. chia đều công việc.. mỗi timer làm việc nhẹ hơn 1 timer.. bộ nhớ phân từng vùng ra làm việc hiệu quả hơn trên 1 vùng
 
Cho hỏi làm cách nào để Hit 1 phát là mất máu..

VD như có spell chạy mỗi 0.01s.. nếu Missile dính Unit thì nó mất máu. Mà nếu cách thường thì chỉ cần tiếp xúc là mất 10 HP tương đương 1s sẽ mất 1000 HP.. bây giờ mình muốn làm nó chỉ mất máu 1 lần thay vì phải chạm tới 1s mới được 1000HP thì làm thế nào. Như vậy khi vừa đụng vào sẽ mất 1000 máu luôn.. và nếu đụng lần 2 mà lần đầu mất rồi thì lần 2 không mất.

Làm giúp mình với JASS nha.
 
Mọi người cho em hỏi muốn Remove 1 Location bằng custom crip mà Biến Array là Integer A + 2 thì Code là gì ?
 
Cho hỏi làm cách nào để Hit 1 phát là mất máu..

VD như có spell chạy mỗi 0.01s.. nếu Missile dính Unit thì nó mất máu. Mà nếu cách thường thì chỉ cần tiếp xúc là mất 10 HP tương đương 1s sẽ mất 1000 HP.. bây giờ mình muốn làm nó chỉ mất máu 1 lần thay vì phải chạm tới 1s mới được 1000HP thì làm thế nào. Như vậy khi vừa đụng vào sẽ mất 1000 máu luôn.. và nếu đụng lần 2 mà lần đầu mất rồi thì lần 2 không mất.

Làm giúp mình với JASS nha.

Ko biết làm Jass nhưng mà có gợi ý là khi pick group xung quanh con unit đó thì sẽ check thêm nếu (Picked Unit) nằm trong 1 group gọi là HitGroup hay chưa. Nếu chưa gây dmg cho nó rồi add nó vào HitGroup.

---------- Post added at 19:52 ---------- Previous post was at 19:50 ----------

Mọi người cho em hỏi muốn Remove 1 Location bằng custom crip mà Biến Array là Integer A + 2 thì Code là gì ?

Call RemoveLocation(udg_Tênbiến[GetForLoopIndexA()])
 
Cho hỏi làm cách nào để Hit 1 phát là mất máu..

VD như có spell chạy mỗi 0.01s.. nếu Missile dính Unit thì nó mất máu. Mà nếu cách thường thì chỉ cần tiếp xúc là mất 10 HP tương đương 1s sẽ mất 1000 HP.. bây giờ mình muốn làm nó chỉ mất máu 1 lần thay vì phải chạm tới 1s mới được 1000HP thì làm thế nào. Như vậy khi vừa đụng vào sẽ mất 1000 máu luôn.. và nếu đụng lần 2 mà lần đầu mất rồi thì lần 2 không mất.

Làm giúp mình với JASS nha.

nếu bằng jass cậu sử dụng tích hợp system này vào (xe0.8) . điển hình ví dụ sử dụng xe0.8 ở đây:
Mã:
library AbilityTest initializer abiInitz requires xecollider, xecast
private function AbilityCon takes nothing returns boolean
    if ( not ( GetSpellAbilityId() == 'which?' ) ) then   // thay which? = gia tri integer ability code
        return false
    endif
    return true
endfunction

private struct abiTest extends xecollider
    unit cHand
    unit tHand
    group gHand
    method onUnitHit takes unit target returns nothing
        if (IsUnitEnemy(target, GetOwningPlayer(this.cHand)) and IsUnitInGroup(target,gHand)==false then
            if (this.cHand != target) and (this.tHand != target) and GetWidgetLife(target)>0.405 and GetUnitAbilityLevel(target, 'Avul') == 0 then
                 call UnitDamageTarget(this.cHand,target,whichdam?(real),false,false,WHICH_ATTACK_TYPE,WHICH_DAMAGE_TYPE,null)
                 call GroupAddUnit(gHand,target)
            endif
        endif
    endmethod
       
    method onDestroy takes nothing returns nothing
        call this.terminate()
        call GroupClear(gHand)
        call DestroyGroup(gHand)
        set this.cHand = null 
        set this.tHand = null
    endmethod
       
endstruct

private function AbilityAct takes nothing returns nothing
    local unit cast=GetTriggerUnit()
    local unit t=GetSpellTargetUnit() //local giá trị này khi mục tieu là unit
    local location p=GetSpellTargetLoc() //local giá trị này một khi sử dụng mục tiêu là location ! Neu co t, local location p=GetUnitLoc
    local abiTest missile
    local location p2=GetUnitLoc(c)
    local real fac=AngleBetweenPoints(p2,p)
    set missile=abiTest.create(GetUnitX(cast),GetUnitY(cast),(fac / bj_RADTODEG))
    set missile.path="đường dẫn model for missile"
    set missile.expirationTime= 1.0// thoi gian ton tai
    set missile.scale=1.0// gia tri phong dai
    set missile.speed=900 // toc do bay bt cua mot missile
    set missile.cHand=cast
    set missile.gHand=CreateGroup()
    set cast=null
    set t=null
    call RemoveLocation(p)
    call RemoveLocation(p1)
endfunction

function abiInitz takes nothing returns nothing
    local trigger whichTrig = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( whichTrig, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( whichTrig, Condition( function AbilityCon ) )
    call TriggerAddAction( whichTrig, function AbilityAct )
    set whichTrig=null
endfunction
endlibrary

cậu tham khảo, viết bằng tay nên đôi khi có lỗi do kô kiểm tra nhé
 
Cho em hỏi cái Trigger nay` bị Lỗi gì thế ??
//===========================================================================
// Trigger: Knockback Knife
//===========================================================================
function Trig_Knockback_Knife_Conditions takes nothing returns boolean
if ( not ( GetSpellAbilityId() == 'A005' ) ) then
return false
endif
return true
endfunction

function Trig_Knockback_Knife_Func002C takes nothing returns boolean
if ( not ( GetLearnedSkillBJ() == 'A005' ) ) then
return false
endif
return true
endfunction

function Trig_Knockback_Knife_Actions takes nothing returns nothing
call KnockbackTarget(GetSpellAbilityUnit() , GetSpellTargetUnit() , GetUnitFacing(GetSpellAbilityUnit()) , 250.00 , 5.00 , true , true , true)
 
^ rất đơn giản: thiếu endfunction, thiếu function initializer ...
 
Ko biết làm Jass nhưng mà có gợi ý là khi pick group xung quanh con unit đó thì sẽ check thêm nếu (Picked Unit) nằm trong 1 group gọi là HitGroup hay chưa. Nếu chưa gây dmg cho nó rồi add nó vào HitGroup.

---------- Post added at 19:52 ---------- Previous post was at 19:50 ----------



Call RemoveLocation(udg_Tênbiến[GetForLoopIndexA()])


Cách này thì mình biết rồi.. vì muốn làm MUI nên dùng cách này không được. Mình nghĩ qua JASS cũng lưu y chang nhưng chưa biết cách làm


nếu bằng jass cậu sử dụng tích hợp system này vào (xe0.8) . điển hình ví dụ sử dụng xe0.8 ở đây:
Mã:
library AbilityTest initializer abiInitz requires xecollider, xecast
private function AbilityCon takes nothing returns boolean
    if ( not ( GetSpellAbilityId() == 'which?' ) ) then   // thay which? = gia tri integer ability code
        return false
    endif
    return true
endfunction

private struct abiTest extends xecollider
    unit cHand
    unit tHand
    group gHand
    method onUnitHit takes unit target returns nothing
        if (IsUnitEnemy(target, GetOwningPlayer(this.cHand)) and IsUnitInGroup(target,gHand)==false then
            if (this.cHand != target) and (this.tHand != target) and GetWidgetLife(target)>0.405 and GetUnitAbilityLevel(target, 'Avul') == 0 then
                 call UnitDamageTarget(this.cHand,target,whichdam?(real),false,false,WHICH_ATTACK_TYPE,WHICH_DAMAGE_TYPE,null)
                 call GroupAddUnit(gHand,target)
            endif
        endif
    endmethod
       
    method onDestroy takes nothing returns nothing
        call this.terminate()
        call GroupClear(gHand)
        call DestroyGroup(gHand)
        set this.cHand = null 
        set this.tHand = null
    endmethod
       
endstruct

private function AbilityAct takes nothing returns nothing
    local unit cast=GetTriggerUnit()
    local unit t=GetSpellTargetUnit() //local giá trị này khi mục tieu là unit
    local location p=GetSpellTargetLoc() //local giá trị này một khi sử dụng mục tiêu là location ! Neu co t, local location p=GetUnitLoc
    local abiTest missile
    local location p2=GetUnitLoc(c)
    local real fac=AngleBetweenPoints(p2,p)
    set missile=abiTest.create(GetUnitX(cast),GetUnitY(cast),(fac / bj_RADTODEG))
    set missile.path="đường dẫn model for missile"
    set missile.expirationTime= 1.0// thoi gian ton tai
    set missile.scale=1.0// gia tri phong dai
    set missile.speed=900 // toc do bay bt cua mot missile
    set missile.cHand=cast
    set missile.gHand=CreateGroup()
    set cast=null
    set t=null
    call RemoveLocation(p)
    call RemoveLocation(p1)
endfunction

function abiInitz takes nothing returns nothing
    local trigger whichTrig = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( whichTrig, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( whichTrig, Condition( function AbilityCon ) )
    call TriggerAddAction( whichTrig, function AbilityAct )
    set whichTrig=null
endfunction
endlibrary

cậu tham khảo, viết bằng tay nên đôi khi có lỗi do kô kiểm tra nhé

Mình chưa hiểu lắm vì sao phải dùng library??
với lại có mấy thứ mình chưa biết dùng như method, library..v..v...

không biết làm theo cách này có được không . khi test spell thì thấy nó takes damage ok. nhưng không biết theo cách dưới đây có hoạt động đúng trong trường hợp muốn MUI spell không .?

[spoil]
PHP:
scope PoisonArrow initializer  Arrow

globals
    private integer idSpell = 'A02A'
    private integer idDummy = 'h015'
endglobals

    private struct data
    unit hero
    unit dummy
    
    real x
    real y
    
    real angle
    group H

    integer tick
    timer t
    endstruct
    
    private function Conditions takes nothing returns boolean
                        return GetSpellAbilityId() == idSpell
    endfunction

private function removetree takes nothing returns nothing
    call KillDestructable( GetEnumDestructable() )
endfunction
    
private function MoveArrow takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local data d = GetTimerData(t)
    local group g = CreateGroup()

    
    local integer lv = GetUnitAbilityLevel(d.hero,idSpell)
    local integer lvl = GetUnitLevel(d.hero)
    
    local real x = d.x
    local real y = d.y
    
    local real tx
    local real ty
    
    local unit temp
    local location p

            set p = GetUnitLoc(d.dummy)
            call EnumDestructablesInCircleBJ(58,p,function removetree )
            call RemoveLocation(p)
      
       
        if d.tick < 200 then
            
            set tx=x+20*d.tick*Cos(d.angle*bj_DEGTORAD)
            set ty=y+20*d.tick*Sin(d.angle*bj_DEGTORAD)
            
            
            call SetUnitPosition(d.dummy,tx,ty)
            
            
            
            call GroupEnumUnitsInRange(g,tx,ty,100,null)
    
                    loop
                        set temp = FirstOfGroup(g)
                       
                            exitwhen temp == null 
                                        if IsUnitEnemy(temp , GetOwningPlayer(d.dummy)) and  IsUnitInGroup(temp, d.H) != true   then
                                    
                                        call UnitDamageTargetBJ(d.dummy,temp,DAMAGE(lv,lvl), ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL )
                                
                                        call GroupRemoveUnit(g,temp)
                              
                                        endif
                            call GroupAddUnit(d.H,temp)
                            call GroupRemoveUnit(g,temp)
                               
                    endloop
            call DestroyGroup(g)
            set temp = null

            else
            
            call RemoveUnit(d.dummy)
            call GroupRemoveGroup(d.H,d.H)
            call DestroyGroup(d.H)
            set d.hero = null
            set d.dummy = null
            set d.H = null
            call ReleaseTimer(d.t)
            call d.destroy()
            endif
        
    
call DestroyGroup(g)

set temp = null

set d.tick = d.tick + 1
set t = null
set p = null
endfunction

private function Actions takes nothing returns nothing
    local data d = data.create()
    
    local unit hero = GetSpellAbilityUnit()

    local real x = GetUnitX(hero)
    local real y = GetUnitY(hero)
    local real tx = GetSpellTargetX()
    local real ty = GetSpellTargetY()
    
    local integer lv = GetUnitAbilityLevel(hero,idSpell)
    local integer lvl = GetUnitLevel(hero)
    
    local real angle = bj_RADTODEG*Atan2(ty-y,tx-x)

 set d.hero = hero
 

 set d.x = x
 set d.y = y
 
 set d.angle = angle 
 
 set d.dummy =  CreateUnit(GetOwningPlayer(hero),idDummy,x,y,angle)
       
 set d.tick = 1
 set d.t = NewTimer()
 set d.H = CreateGroup()   
    call SetTimerData(d.t,d)
    call TimerStart(d.t,0.01,true,function MoveArrow  )

 

 set hero = null


endfunction

//===========================================================================
    private function Arrow takes nothing returns nothing
local trigger t = CreateTrigger(  )
  
    call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( t, Condition( function Conditions ) )
    call TriggerAddAction( t, function Actions )
endfunction

endscope
[/spoil]

Trình viết JASS còn gà nên dòm thấy nhìu quá.. nhìn cái của bạn viết mà mình đờ ra luôn. :@)
 
đây. tại mình quen sử dụng library rồi nên viết vậy luôn. thực chất cậu có quyền sử dụng scope thay library cho tiện. còn private struct nghĩa là lấy một cấu trúc lấy bên xecollider (tạm hiểu vậy đi, song thì tìm hiểu sâu vào). method thì cậu cứ làm theo vậy đi. cụ thể khi am hiểu system là gì thì mình giải thích tại sao nó như vậy
@ cái struct của cậu leak - thiếu method onDestroy takes nothing returns nothing
 
đây. tại mình quen sử dụng library rồi nên viết vậy luôn. thực chất cậu có quyền sử dụng scope thay library cho tiện. còn private struct nghĩa là lấy một cấu trúc lấy bên xecollider (tạm hiểu vậy đi, song thì tìm hiểu sâu vào). method thì cậu cứ làm theo vậy đi. cụ thể khi am hiểu system là gì thì mình giải thích tại sao nó như vậy
@ cái struct của cậu leak - thiếu method onDestroy takes nothing returns nothing

Struct của mình bị leak là do thiếu cái method gì gì trên.. vậy nghĩa là khi có khai báo bất kỳ biến gì ở Struct cũng phải dùng method OnDestroy để xóa nó đi hả..
nhưng mà làm sao để gọi cái method trong struct đó xóa leak đi.. hay nó tự động xóa leak.. vì như cái bạn ghi mình không thấy gọi onDestroy ở đâu cả. (cũng có thể không thấy, bạn in đậm giúp mình..)

PS: hix.. vậy là leak struct của mình hơi bị nhiều.. chỉ cách mình xóa leak cái này với.. mình chưa hiểu bạn nói lắm.. nói rõ tý nữa :D
 
Chỉnh sửa cuối:
Bà con cho hỏi đối với Amination mà dạng chuẩn như spell slam, spell, ... thì khi dùng trigger hay cho vào spell thì vẫn bt nhưng với dạng có con số theo sau như attack - 1, attack - 2, ... thì khi cho trong spell thì cho thế lào ?
 
Status
Không mở trả lời sau này.
Back
Top