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

Thảo luận trong 'World Editor' bắt đầu bởi Tom_Kazansky, 2/6/11.

Trạng thái chủ đề:
Không mở trả lời sau này.
  1. wewe_1312

    wewe_1312 Mr & Ms Pac-Man

    Tham gia ngày:
    28/4/10
    Bài viết:
    130
    mình k thể tìm ra được Local Player nó nằm ở chỗ nào bạn ạ, mình k dùng EGUI nhé :( làm sao bg :(
    Còn vụ lag ở map mình thì thật ra mình remove dummy và leak các thứ rất cẩn thận rồi đấy chứ :( nhưng theo mình nghĩ là do có nhiều pkm có skill rắc rối nên tốc độ xử lý bị chậm lại :(
     
  2. AzuhaSky

    AzuhaSky T.E.T.Я.I.S

    Tham gia ngày:
    30/5/10
    Bài viết:
    550
    Nơi ở:
    WE Box
    Bạn bật USMWE lên rồi sau tìm Conditions hàm Player ấy!
    P/s: Về vụ đó thì còn một vấn đề nho nhỏ là map bạn quá nhiều unit trong dữ liệu, quá nhiều dummy effect vì vậy nên ---> Mỗi lần load unit thì nó phải lấy tất cả dữ liệu dummy tương tự trong cùng một race (Lâu lâu mới bị) nên dẫn đến lag - Chú ý ít lạm dụng nhiều loại dummy khác nhau bạn nhé!
     
  3. ZhengHe

    ZhengHe T.E.T.Я.I.S

    Tham gia ngày:
    4/1/09
    Bài viết:
    623
    Cho hỏi spell này lỗi ở đâu mà dummy ko move.
    System TimerUtils + snippet GetClosestUnit
    Mã:
    scope DarkOrb initializer Init
    
    globals
       private constant integer SPELL_ID    = 'A00C'
       private constant integer PROJ_MODEL = 'e00F'
       private constant string  IMPACT_SFX  = "DarkFlash.mdx"
       private constant real    RANGE       = 1000.
    endglobals
    
    struct darkorb
       unit    caster
       unit    dummy
       real    angle
       integer tick
       real    distance
       real    dmg
    endstruct
    
    
    private function Conds takes nothing returns boolean
       return GetSpellAbilityId() == SPELL_ID
    endfunction
    
    private function TargetFilter takes nothing returns boolean
       return IsUnitEnemy(GetFilterUnit(), (GetOwningPlayer(GetTriggerUnit()))) and IsUnitAliveBJ(GetFilterUnit()) and IsUnitType(GetFilterUnit(), UNIT_TYPE_MAGIC_IMMUNE) and IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE)
    endfunction
    
    private function Fire takes nothing returns nothing
       local timer ti = GetExpiredTimer()
       local darkorb do = GetTimerData(ti)
       local location loc1  = GetUnitLoc(do.dummy)
       local location loc2 = GetSpellTargetLoc()
       local location loc3
       local real x = GetLocationX(loc3)
       local real y = GetLocationY(loc3)
       local unit u = GetClosestUnit(x, y, Condition(function TargetFilter))
       set do.angle = AngleBetweenPoints(loc1, loc2)
       set loc3 = PolarProjectionBJ(loc1, do.distance, do.angle)
       call SetUnitFacing(do.dummy, do.angle)
       call SetUnitPositionLoc(do.dummy, loc3)
       call RemoveLocation(loc1)
       call RemoveLocation(loc2)
       call RemoveLocation(loc3)
       set loc1 = null
       set loc2 = null
       set loc3 = null
       set do.tick = do.tick - 1
       if do.tick <= 0 then
          call do.destroy()
          call ReleaseTimer(ti)
          call RemoveUnit(do.dummy)
          call DestroyEffect(AddSpecialEffect(IMPACT_SFX, x, y))
       else
          call UnitDamageTargetEx(do.caster, u, do.dmg, false, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, null)
       endif
       set u  = null
       set ti = null
    endfunction
    
    private function Setup takes unit caster, unit dummy, real angle, real distance, real dmg returns nothing
       local darkorb do = darkorb.create()
       local timer ti  = NewTimer()
       set do.caster   = caster
       set do.dmg      = dmg
       set do.dummy    = dummy
       set do.angle    = angle
       set do.tick     = R2I(RANGE/0.04)
       set do.distance = RANGE/do.tick
       call SetTimerData(ti, do)
       call TimerStart(ti, 0.04, true, function Fire)
       set ti = null
    endfunction
    
    private function Actions takes nothing returns nothing
       local unit c = GetTriggerUnit()
       local real angle = GetUnitFacing(c)
       local location cloc = GetUnitLoc(c)
       local real dmg = (I2R(GetUnitAbilityLevel(c, SPELL_ID)*10)+20)+((I2R(GetHeroInt(c, true)))*GetRandomReal(0.5,1.5))
       local unit dummy
       call CreateUnitAtLoc(GetOwningPlayer(c), PROJ_MODEL, cloc, angle)
       set dummy = GetLastCreatedUnit()
       call Setup(c, dummy, angle, RANGE, dmg)
       call RemoveLocation(cloc)
       set dummy = null
       set cloc = null
       set c = null
       
    endfunction
    
    //===========================================================================
    private function Init takes nothing returns nothing
        local trigger trg = CreateTrigger()
        call TriggerRegisterAnyUnitEventBJ( trg, EVENT_PLAYER_UNIT_SPELL_EFFECT )
        call TriggerAddAction(trg, function Actions)
        call TriggerAddCondition(trg, function Conds)
    endfunction
    
    endscope
     
  4. Tom_Kazansky

    Tom_Kazansky

    Tham gia ngày:
    28/12/06
    Bài viết:
    3,454
    Nơi ở:
    Hà Nội
    Mã:
     call CreateUnitAtLoc(GetOwningPlayer(c), PROJ_MODEL, cloc, angle) 
    set dummy = GetLastCreatedUnit()
    
    native CreateUnitAtLoc không trả về "last created unit", nên "dummy" ko phải là unit vừa được tạo, phải sửa là:

    Mã:
    set dummy = CreateUnitAtLoc(GetOwningPlayer(c), PROJ_MODEL, cloc, angle) 
     
  5. AzuhaSky

    AzuhaSky T.E.T.Я.I.S

    Tham gia ngày:
    30/5/10
    Bài viết:
    550
    Nơi ở:
    WE Box
    Hờ hờ??? Bài tớ hôm qua trả lời đâu mất ùi?:(
    Bây giờ tớ sẽ trả lời lại nhé:
    Hai hàm phía trên bạn đã đặt sai vị trí của chúng, hãy thử đảo ngược chúng lại xem nào? Nếu vẫn không hiệu quả, thay vì dùng Remove, bạn nên call UnitAppleTimerLife(do.dummy,'BLFT',0.05) để giết dummy bạn nhé! Đôi điều gửi đến!:)
     
    Chỉnh sửa cuối: 9/6/11
  6. ZhengHe

    ZhengHe T.E.T.Я.I.S

    Tham gia ngày:
    4/1/09
    Bài viết:
    623
    @Tom: em đã sửa nhưng dummy vẫn ko di chuyển, anh có thể làm 1 cái demo về slide dummy unit ko?

    @AzuhaSky: mình gặp vấn đề ở phần slide dummy chứ ko phải remove dummy ^^.
     
  7. DylandKyo

    DylandKyo Donkey Kong

    Tham gia ngày:
    28/10/10
    Bài viết:
    358

    mình hỉu phần buff đó, nhưng ý mình hỏi buff ở đó ở đâu ra????. Trong phần op của skill k có buff @@
     
  8. AzuhaSky

    AzuhaSky T.E.T.Я.I.S

    Tham gia ngày:
    30/5/10
    Bài viết:
    550
    Nơi ở:
    WE Box
    Mình biết tại sao nè:
    local location loc3 bạn chưa cho nó bất kỳ giá trị gì cả mà đã local real x,y= GetLocationX,Y(loc3) rồi! Trigger dừng lại tại chỗ này đấy bạn!Cẩn thận nhé
    Hờ.... Phần buff của skill auto cast bạn làm đó, bạn không có buff thì làm sao làm autocast bằng trigg được?
     
    Chỉnh sửa cuối: 9/6/11
  9. DylandKyo

    DylandKyo Donkey Kong

    Tham gia ngày:
    28/10/10
    Bài viết:
    358
    Hjz mình chịu, do mình base từ skill auto-cast có sẳn trong war, nên chẳng tìm đc phần chỉnh lv, hay buff..... Sky làm giúp mình 1 demo đc k. Skill đơn giản thui.
    Tks sky nhìu.
     
  10. AzuhaSky

    AzuhaSky T.E.T.Я.I.S

    Tham gia ngày:
    30/5/10
    Bài viết:
    550
    Nơi ở:
    WE Box
    Xong rồi, mình dính kèm file phía dưới ấy! Lưu ý nho nhỏ cho bạn là cái này mình dùng system vjass. Bởi làm vậy nó tiện hơn là dùng GUI, nó MUI hơn nữa!Chúc bạn thành công!
     

    Các file đính kèm:

    DylandKyo thích bài này.
  11. ZhengHe

    ZhengHe T.E.T.Я.I.S

    Tham gia ngày:
    4/1/09
    Bài viết:
    623
    @AzuhaSky: bạn có thể cho mình cái demo về slide dummy unit tương tự như skill elune's arrow của hổ trong dota ko?
     
  12. AzuhaSky

    AzuhaSky T.E.T.Я.I.S

    Tham gia ngày:
    30/5/10
    Bài viết:
    550
    Nơi ở:
    WE Box
    Tớ đâu biết chiêu đó chớ:(( ! Nếu làm dựa theo chiêu hồi nãy thì mình xin hỏi là làm cái move dummy, đụng con nào gây dam hay là chờ dummy chết rồi gây dam?
     
  13. Ice_water

    Ice_water Dragon Quest

    Tham gia ngày:
    11/1/07
    Bài viết:
    1,457
    @ZhengHe : Cái trigger mà bạn bắt người khác sửa ko phải là 1 dạng của elune's arrow ??? Nếu bạn thực sự ko hiểu trigger mà bạn post thì bạn đừng lên post mà hãy lên google đánh chữ "Elune's Arrow" vì cái đề tài này mọc ko khác gì như nấm ở Wc3 hoặc hive kèm theo 1 lố map demo, thích cái nào thì down về mà coi.
    Vấn đề này cũng được hỏi trong gvn đến gần 30 lần.
     
  14. ZhengHe

    ZhengHe T.E.T.Я.I.S

    Tham gia ngày:
    4/1/09
    Bài viết:
    623
    @ice:

    Mình đã tìm trên mạng đc 1 cái skill slide dummy và mình đã làm nó slide đc nhưng dummy chỉ slide 1 góc 45 độ về phía trái chứ ko bay theo hướng trước mặt caster.
    Mã:
    scope DarkOrb initializer Init
    
    globals
       private constant integer SPELL_ID    = 'A00C'
       private constant integer PROJ_MODEL  = 'e00F'
       private constant string  IMPACT_SFX  = "Abilities\\Spells\\Undead\\RegenerationAura\\ObsidianRegenAura.mdl"
       private constant real    RANGE       = 1200.
       private constant real    SPEED       = 40.
       private constant attacktype A_type   = ATTACK_TYPE_NORMAL
       private constant damagetype D_type   = DAMAGE_TYPE_NORMAL
    endglobals
    
    private function Damage takes integer lvl returns real
        return 50.*lvl
    endfunction
    
    private function DamageTarget takes unit caster, unit target, real dmg returns nothing
       call UnitDamageTargetEx(caster, target, dmg, false, false, A_type, D_type, null)
    endfunction
    
    private struct Data
        timer t
        real tick
        unit dummy
        unit caster
        integer lvl
        location dumloc
        location targloc                               // onDestroy method damages group using HMDamageArea.
        location newpos                                // Also Clears Struct and releases timer.
        real x
        real y
        real dmg
        unit target
        
        private method onDestroy takes nothing returns nothing 
           call DamageTarget(.caster,.target, .dmg)
           call DestroyEffect(AddSpecialEffect(IMPACT_SFX, .x, .y))
           call ReleaseTimer(.t)
        endmethod
    endstruct
    
    
    private function Conds takes nothing returns boolean
       return GetSpellAbilityId() == SPELL_ID
    endfunction
    
    private function Move takes nothing returns nothing
       local Data d = GetTimerData(GetExpiredTimer())
       set d.dumloc = GetUnitLoc(d.dummy)
       set d.newpos = PolarProjectionBJ(d.dumloc, SPEED, AngleBetweenPoints(d.dumloc, d.targloc))
       set d.x = GetLocationX(d.dumloc)
       set d.y = GetLocationY(d.dumloc)
       call SetUnitPositionLoc(d.dummy, d.newpos)
       call SetUnitFacing(d.dummy, AngleBetweenPoints(d.dumloc, d.targloc))
       if d.tick <= 0 then
          call ReleaseTimer(d.t)
          call RemoveUnit(d.dummy)
          call d.destroy()
       else
          set d.tick = d.tick - 1
       endif
       
       call RemoveLocation(d.targloc)
       call RemoveLocation(d.dumloc)
       call RemoveLocation(d.newpos)
    endfunction
    
    private function Actions takes nothing returns nothing
       local Data d = Data.create()
       local location casterpos
       local location targetloc
        set d.caster = GetTriggerUnit()
        set casterpos = GetUnitLoc(d.caster)
        set targetloc = GetSpellTargetLoc()
        set d.targloc = targetloc
        set d.lvl = GetUnitAbilityLevel(d.caster,SPELL_ID)
        set d.dmg = (I2R(d.lvl*3)+15)+(I2R(GetHeroInt(d.caster, true))*GetRandomReal(0.2,1.))
        set d.dummy = CreateUnitAtLoc(GetOwningPlayer(d.caster), PROJ_MODEL, PolarProjectionBJ(casterpos, 10, AngleBetweenPoints(casterpos,targetloc)),AngleBetweenPoints(casterpos,targetloc))
        set d.tick = RANGE*0.04
        
        set d.t = NewTimer()
        call SetTimerData(d.t,d)
        call TimerStart(d.t,0.04,true,function Move)
        
        call RemoveLocation(targetloc)
        call RemoveLocation(casterpos)    
        set casterpos=null
        set targetloc=null
    endfunction
    
    //===========================================================================
    private function Init takes nothing returns nothing
        local trigger trg = CreateTrigger(  )
        call TriggerRegisterAnyUnitEventBJ(trg,EVENT_PLAYER_UNIT_SPELL_EFFECT)
        call TriggerAddCondition(trg, function Conds)
        call TriggerAddAction( trg, function Actions )
    endfunction
    
    endscope
    Ngoài ra mình còn 1 câu hỏi nữa:

    Mã:
       private function UnitFilter takes nothing returns boolean
                  return IsUnitEnemy(GetFilterUnit(), GetOwningPlayer(GetTriggerUnit())) == true and GetWidgetLife( GetFilterUnit( ) ) > 0.405 and IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) == false and IsUnitType(GetFilterUnit(), UNIT_TYPE_MAGIC_IMMUNE) == false
       endfunction
    
    --------------
       call GroupEnumUnitsInArea(g, x, y, 300, Condition(function UnitFilter))   //dùng GroupUtils
    
    Vấn đề là dù mình đã cho điều kiện là IsUnitEnemy(GetFilterUnit(), GetOwningPlayer(GetTriggerUnit())) == true thì nó vẫn lấy luôn các hero cùng team rồi deal damage.
     
  15. orochi x

    orochi x Mr & Ms Pac-Man

    Tham gia ngày:
    20/7/10
    Bài viết:
    246
    cho mình hỏi với: ví dụ sau khi mình đặt 1 con cenarius vào map (blue)(nó là ally của mình) thì làm thế nào để cho bọn blue điều khiển dc con đấy như hero mà nó train, nhưng mà chỉ cho con cenarius này đi bảo vệ các nhà của blue và ally khi bị đánh thôi?
     
  16. Ice_water

    Ice_water Dragon Quest

    Tham gia ngày:
    11/1/07
    Bài viết:
    1,457

    Fail trigger !! Tìm 1 cái mới mà copy zo.
    targloc : đã bị xóa ngay từ timer đầu tiên nên đến timer 2 thì ko còn
    Nếu có sửa đi nữa thì nếu dummy bay qua targloc thì nó cũng quay về targloc rồi kẹt ở đó luôn.

    GetTriggerUnit() ở đây là cái gì ? Và cái GetTriggerUnit() liệu có đúng là unit cần được xác định ???
     
  17. orochi x

    orochi x Mr & Ms Pac-Man

    Tham gia ngày:
    20/7/10
    Bài viết:
    246
    ai giúp mình cái này đi với !!!!!!
     
  18. raivor

    raivor Dragon Quest Lão Làng GVN

    Tham gia ngày:
    24/7/09
    Bài viết:
    1,411
    Vào WE test ngay .
     
  19. Tom_Kazansky

    Tom_Kazansky

    Tham gia ngày:
    28/12/06
    Bài viết:
    3,454
    Nơi ở:
    Hà Nội
    ờ... hơi khó hiểu

    cụ thể ở post nào, bạn cho link được không?
    trong trường hợp cụ thể thì mới nói là nên hay ko nên, tôi phải xem trường hợp nào đang được nói đến thì mới có thể trả lời "vì sao" của bạn
     
  20. orochi x

    orochi x Mr & Ms Pac-Man

    Tham gia ngày:
    20/7/10
    Bài viết:
    246
    thông cảm :D đây nhé: khi đặt 1 con cenarius (blue) vào trong map thì bọn blue(computer) lại ko điều khiển con đấy như các heroes mà nó trained. vậy thì làm thế nào để bọn blue chơi cenarius như các heroes dc?
     
Trạng thái chủ đề:
Không mở trả lời sau này.

Chia sẻ trang này