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

Status
Không mở trả lời sau này.
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 :(
 
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 :(

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é!
 
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
 
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)
 
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é:
call do.destroy()
call ReleaseTimer(ti)
call RemoveUnit(do.dummy)
call DestroyEffect(AddSpecialEffect(IMPACT_SFX, x, y))
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:
@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 ^^.
 
^:
Mã:
if UnitHasBuffBJ(t,'buff') then
ý bạn là phần buff trong đây phải ko?
hàm này nghĩa là nếu unit t có buff (buff này tùy thuộc vào skill của bạn mình ví dụ nó là slow) thì sẽ chạy cách lệnh call phía dưới.


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 @@
 
@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 ^^.

Mình biết tại sao nè:
local location loc3
local real x = GetLocationX (loc3)
local real y = GetLocationY(loc3)

local unit u = GetClosestUnit(x, y, Condition(function TargetFilter))
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é
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 @@

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:
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?

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.
Gồm 10 lv, auto-cast, khi tấn công vào mục tiêu thì tạo ngay mục tiêu một đốm lửa, 5% - 50% gây bỏng. Bỏng: gây thêm 10 damage mỗi giây, duy trì 5 giây.
Damage: 100% - 550% damage base (tính lun dame + vào nhờ item nếu có)
Tks sky nhìu.
 
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.

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!
 

Attachments

@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?
 
@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?

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?
 
@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.
 
@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.
 
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?
 
@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.

Ngoài ra mình còn 1 câu hỏi nữa:


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 ???
 
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?

ai giúp mình cái này đi với !!!!!!
 
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?

ờ... hơi khó hiểu

Mình đi 1 vài forum nước ngoài thấy họ khuyên là ko nên dùng hàm pause unit, vì sao vậy?

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
 
ờ... 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

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?
 
Status
Không mở trả lời sau này.
Back
Top