XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Закрытая тема
 
Raptor2108

offline
Опыт: 195
Активность:
Спел огненный шар
scope Fire initializer Init

    globals
     private real RADIUS = 150
     private real DAMAGE = 140
     private integer AID ='A000'
     private real SPEED = 65
      private string EFFECT = "Abilities\\Spells\\Orc\\LiquidFire\\Liquidfire.mdl"
     private string EFFECT1 = "fireball.mdx"
     private attacktype AT = ATTACK_TYPE_MAGIC
     private damagetype DT = DAMAGE_TYPE_NORMAL
     private weapontype WT = null
    endglobals
    
    private function UnitFilter takes nothing returns boolean
        local unit u=LoadUnitHandle(HASH,GetHandleId(GetExpiredTimer()),StringHash("unit"))
        return (GetUnitState(GetFilterUnit(),UNIT_STATE_LIFE)>0.) and IsUnitEnemy(GetFilterUnit(),GetOwningPlayer(u)) and IsUnitType(GetFilterUnit(),UNIT_TYPE_FLYING)==false and IsUnitType(GetFilterUnit(),UNIT_TYPE_MECHANICAL)==false and IsUnitType(GetFilterUnit(),UNIT_TYPE_STRUCTURE)==false
    endfunction
    
    private function FirePeri takes nothing returns nothing
    local timer q = GetExpiredTimer()
    local integer h = GetHandleId(q)
    local unit t = LoadUnitHandle(HASH, h, StringHash("target"))
    local unit u = LoadUnitHandle(HASH, h, StringHash("unit"))
    local real a = LoadReal(HASH, h, StringHash("angle"))
    local integer i = LoadInteger(HASH, h, StringHash("cound"))
    local real x
    local real y
    local group g = CreateGroup()
    local unit f
    if(i>=0) then
       call SaveInteger(HASH, h, StringHash("cound"), i-1)
       set x = GetUnitX(t) + SPEED * Cos(a)
       set y = GetUnitY(t) + SPEED * Sin(a)
       call GroupEnumUnitsInRange(g, x, y, RADIUS, Condition(function UnitFilter))
       loop
          set f = FirstOfGroup(g)
          exitwhen f == null
          call UnitDamageTarget(u, f, DAMAGE, true, true, AT, DT, WT)
          call DestroyEffect(AddSpecialEffectTarget(EFFECT, f, "origin"))
          call GroupRemoveUnit(g, f)
        endloop
          
       if (IsTerrainPathable(x, y, PATHING_TYPE_WALKABILITY) ==false) then
             call SetUnitX(t, x)
             call SetUnitY(t, y)
        endif
    else
        call Flush(q)
    endif
     set t = null
     set q = null
     set f = null
     set g = null
   endfunction

    private function FireMain takes nothing returns nothing
    local unit u = GetTriggerUnit()
    local timer q = CreateTimer()
    local unit t = CreateUnit(GetOwningPlayer(u), 'h000', GetUnitX(u), GetUnitY(u), 0)
    local real a = Atan2(GetUnitY(t) - GetUnitY(u), GetUnitX(t)-GetUnitX(u))    
    call SaveUnitHandle(HASH, GetHandleId(q), StringHash("target"), t)
    call SaveReal(HASH, GetHandleId(q), StringHash("angle"),a)
    call SaveInteger(HASH, GetHandleId(q), StringHash("cound"), 10)
    call SaveUnitHandle(HASH, GetHandleId(q), StringHash("unit"), u)
    call TimerStart(q, .03, true, function FirePeri)
    set q = null
    set t = null
    set u = null
    endfunction
    
     private function FireConditio takes nothing returns boolean
     return GetSpellAbilityId() == AID
     endfunction
    
     private function Init takes nothing returns nothing
        local trigger t=CreateTrigger()
        local integer i=0
        loop
            call TriggerRegisterPlayerUnitEvent(t,Player(i),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
            set i=i+1
            exitwhen i==16
        endloop
        call TriggerAddCondition(t,Condition(function  FireConditio))
        call TriggerAddAction(t,function  FireMain)
        call Preload(EFFECT)
        call PreloadAbility(AID)
        set t=null
    endfunction
    
   endscope 
вот спелл созадет огненный шар котой летит к проитвнику по пути нанося все урон в ращиусе 150. Рабоатет не коректно не наносит урона и летит криво.
[+] замечание от Doc: Используйте тег кода.

Отредактировано Doc, 21.06.2011 в 14:32.
Старый 21.06.2011, 14:03
Doc

offline
Опыт: 63,163
Активность:
Код вроде нормальный, как именно "криво" летит шар? + лучше дайте карту со спеллом.
Doc добавил:
А, урон не наносит из-за фильтра, в нем не может быть события таймера, используйте временные глобальные переменные.
Старый 21.06.2011, 14:44
Raptor2108

offline
Опыт: 195
Активность:
Прилагаю вот спел у мага который второй без картинки.
Прикрепленные файлы
Тип файла: w3x test karta.w3x (22.6 Кбайт, 31 просмотров )
Старый 21.06.2011, 15:06
Doc

offline
Опыт: 63,163
Активность:
scope Fire initializer Init

    globals
     private constant real RADIUS = 150
     private constant real DAMAGE = 140
     private constant integer AID ='A000'
     private constant real SPEED = 65
      private constant string EFFECT = "Abilities\\Spells\\Orc\\LiquidFire\\Liquidfire.mdl"
     private constant string EFFECT1 = "fireball.mdx"
     private constant attacktype AT = ATTACK_TYPE_MAGIC
     private constant damagetype DT = DAMAGE_TYPE_NORMAL
     private constant weapontype WT = null
     
     private unit tmp_hero
    endglobals
    
    private function UnitFilter takes nothing returns boolean
        return (not IsUnitType(GetFilterUnit(), UNIT_TYPE_DEAD) and IsUnitEnemy(GetFilterUnit(), GetOwningPlayer(tmp_hero)) and not IsUnitType(GetFilterUnit(),UNIT_TYPE_FLYING) and not IsUnitType(GetFilterUnit(),UNIT_TYPE_MECHANICAL) and not IsUnitType(GetFilterUnit(),UNIT_TYPE_STRUCTURE))
    endfunction
    
    private function FirePeri takes nothing returns nothing
    local timer q = GetExpiredTimer()
    local integer h = GetHandleId(q)
    local unit t = LoadUnitHandle(HASH, h, StringHash("target"))
    local unit u = LoadUnitHandle(HASH, h, StringHash("unit"))
    local real a = LoadReal(HASH, h, StringHash("angle"))
    local integer i = LoadInteger(HASH, h, StringHash("cound"))
    local real x
    local real y
    local group g = CreateGroup()
    local unit f
    set tmp_hero = u
    if(i>=0) then
       call SaveInteger(HASH, h, StringHash("cound"), i-1)
       set x = GetUnitX(t) + SPEED * Cos(a)
       set y = GetUnitY(t) + SPEED * Sin(a)
       call GroupEnumUnitsInRange(g, x, y, RADIUS, Condition(function UnitFilter))
       loop
          set f = FirstOfGroup(g)
          exitwhen f == null
          call UnitDamageTarget(u, f, DAMAGE, true, true, AT, DT, WT)
          call DestroyEffect(AddSpecialEffectTarget(EFFECT, f, "origin"))
          call GroupRemoveUnit(g, f)
        endloop
          
       if (IsTerrainPathable(x, y, PATHING_TYPE_WALKABILITY) ==false) then
             call SetUnitX(t, x)
             call SetUnitY(t, y)
        endif
    else
        call Flush(q)
    endif
     set t = null
     set q = null
     set f = null
     set g = null
   endfunction

    private function FireMain takes nothing returns nothing
    local unit u = GetTriggerUnit()
    local timer q = CreateTimer()
    local unit tar = GetSpellTargetUnit()
    local unit t = CreateUnit(GetOwningPlayer(u), 'h000', GetUnitX(u), GetUnitY(u), 0)
    local real a = Atan2(GetUnitY(tar) - GetUnitY(u), GetUnitX(tar)-GetUnitX(u))    
    call SaveUnitHandle(HASH, GetHandleId(q), StringHash("target"), t)
    call SaveReal(HASH, GetHandleId(q), StringHash("angle"),a)
    call SaveInteger(HASH, GetHandleId(q), StringHash("cound"), 10)
    call SaveUnitHandle(HASH, GetHandleId(q), StringHash("unit"), u)
    call TimerStart(q, .03, true, function FirePeri)
    set q = null
    set t = null
    set u = null
    set tar = null
    endfunction
    
     private function FireConditio takes nothing returns boolean
     return GetSpellAbilityId() == AID
     endfunction
    
     private function Init takes nothing returns nothing
        local trigger t=CreateTrigger()
        local integer i=0
        loop
            call TriggerRegisterPlayerUnitEvent(t,Player(i),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
            set i=i+1
            exitwhen i==16
        endloop
        call TriggerAddCondition(t,Condition(function  FireConditio))
        call TriggerAddAction(t,function  FireMain)
        call Preload(EFFECT)
        call PreloadAbility(AID)
        set t=null
    endfunction
    
   endscope 
HATE
Старый 21.06.2011, 18:06
Doc

offline
Опыт: 63,163
Активность:
Отставить оффтопик, тема не про циклы, код работает, закрыто.
Старый 23.06.2011, 11:51
Закрытая тема

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 16:22.