Сейчас 18:04:10 Воскресенье, 24 ноября, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
[Вопрос] Создание простого заклинания
Imba_pvLДата: Суббота, 01 Февраля 2014, 16:03:55 | Сообщение # 1
10 уровень
Группа: Проверенные
Сообщений: 3151
Награды: 1
Репутация: 1260
Блокировки:
Т.к. перехожу на джасс, я немного разобрался, (уже понял как и зачем нужны лок.переменные)
Прошу скинуть код, в котором должны происходить след.действия: (сделал бы сам, но не знаю функции, только через бж)
После того, как герой делает способность на точку,выпускается снаряд, как только он долетает, все враги в радиусе 500 получают урон.

Собственно, что мне нужно:
Как правильно использовать таймеры, пикать врагов и наносить им урон, ну и как отследить юнита.(выстрел)
Можно кодом/картой.
Буду благодарен.


 

DiabfallДата: Суббота, 01 Февраля 2014, 17:09:32 | Сообщение # 2
Группа: Проверенные
Сообщений: 1231
Награды: 0
Блокировки:
Можно заценить эту статью.
Цитата Imba_pvL ()
пикать врагов и наносить им урон

Код
unit u=...
unit e
group g=CreateGroup()

call GroupEnumUnitsInRange(g,GetUnitX(u),GetUnitY(u),100., функ. условия)
     loop  
         set e=FirstOfGroup(g)
         exitwhen e==null
         ...
         call UnitDamageTarget( u, e, dmgl, true, false, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_UNKNOWN, WEAPON_TYPE_WHOKNOWS)
         ...
     call GroupRemoveUnit(g,e)
     endloop
.....................
        call DestroyGroup(g)


Цитата Imba_pvL ()
ну и как отследить юнита.(выстрел)

когда разберешься с таймерами, вопрос должен отпасть
 

Imba_pvLДата: Суббота, 01 Февраля 2014, 17:12:41 | Сообщение # 3
10 уровень
Группа: Проверенные
Сообщений: 3151
Награды: 1
Репутация: 1260
Блокировки:
Спасибо.
Вопрос про группу отпал, только одно но
Цитата Diabfall ()
call GroupEnumUnitsInRange(g,GetUnitX(u),GetUnitY(u),100., функ. условия)

Условие...как строчка пишется? просто я сравнивал только что, ну и убедился что изначальный конвертированный текст сильно отличается от этого.


 

SirNikolasДата: Суббота, 01 Февраля 2014, 17:16:35 | Сообщение # 4
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Код
globals
     constant hashtable Hash = InitHashtable()
     constant group G = CreateGroup()
endglobals

//===========================================================================
globals
     constant integer Fireball_Ability = 'A000'
     constant integer Fireball_Dummy = 'h000'
     constant string Fireball_Effect = ""
     constant string Fireball_Attach = "chest"
     constant real Fireball_Period = .05
endglobals

constant function Fireball_Speed takes integer lvl returns real
     return 800. + 100. * lvl
endfunction

constant function Fireball_Damage takes integer lvl returns real
     return 500.
endfunction

constant function Fireball_Range takes integer lvl returns real
     return 400. + 50. * lvl
endfunction

//===========================================================================
function Trig_Fireball_Conditions takes nothing returns boolean
     return GetSpellAbilityId() == Fireball_Ability
endfunction

function Trig_Fireball_Timer takes nothing returns nothing
     local timer t = GetExpiredTimer()
     local integer id = GetHandleId(t)
     local unit dummy = LoadUnitHandle(Hash, id, 0)
     local player p = GetOwningPlayer(dummy)
     local integer remaining = LoadInteger(Hash, id, 0) - 1
     local integer lvl
     local unit u
     local real dmg
     if remaining <= 0 then
         set lvl = LoadInteger(Hash, id, 1)
         set dmg = Fireball_Damage(lvl)
         call GroupEnumUnitsInRange(G, GetWidgetX(dummy), GetWidgetY(dummy), Fireball_Range(lvl), null)
         loop
             set u = FirstOfGroup(G)
             exitwhen u == null
             call GroupRemoveUnit(G, u)
             if GetWidgetLife(u) > .405 and IsUnitEnemy(u, p) and not IsUnitType(u, UNIT_TYPE_MAGIC_IMMUNE) then
                 call DestroyEffect(AddSpecialEffectTarget(Fireball_Effect, u, Fireball_Attach))
                 call UnitDamageTarget(dummy, u, dmg, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
             endif
         endloop
         call KillUnit(dummy)
         call FlushChildHashtable(Hash, id)
         call PauseTimer(t)
         call DestroyTimer(t)
     else
         call SaveInteger(Hash, id, 0, remaining)
         call SetUnitX(dummy, GetWidgetX(dummy) + LoadReal(Hash, id, 0))
         call SetUnitY(dummy, GetWidgetY(dummy) + LoadReal(Hash, id, 1))
     endif
     set t = null
     set dummy = null
     set p = null
endfunction

function Trig_Fireball_Actions takes nothing returns nothing
     local unit caster = GetTriggerUnit()
     local real x = GetWidgetX(caster)
     local real y = GetWidgetY(caster)
     local real tx = GetSpellTargetX()
     local real ty = GetSpellTargetY()
     local real a = Atan2(ty - y, tx - x)
     local timer t = CreateTimer()
     local integer id = GetHandleId(t)
     local integer lvl = GetUnitAbilityLevel(caster, Fireball_Ability)
     local real speedPerTact = Fireball_Speed(lvl) * Fireball_Period
     call SaveAgentHandle(Hash, id, 0, CreateUnit(GetOwningPlayer(caster), Fireball_Dummy, x, y, a * 57.29578))
     call SaveReal(Hash, id, 0, speedPerTact * Cos(a))
     call SaveReal(Hash, id, 1, speedPerTact * Sin(a))
     call SaveInteger(Hash, id, 0, R2I(SquareRoot((tx - x) * (tx - x) + (ty - y) * (ty - y)) / speedPerTact))
     call SaveInteger(Hash, id, 1, lvl)
     call TimerStart(t, Fireball_Period, true, function Trig_Fireball_Timer)
     set caster = null
     set t = null
endfunction

//===========================================================================
function InitTrig_Fireball takes nothing returns nothing
     local trigger trig = CreateTrigger()
     local integer i = 0
     loop
         call TriggerRegisterPlayerUnitEvent(trig, Player(i), EVENT_PLAYER_UNIT_SPELL_EFFECT, null)
         exitwhen i == 15
         set i = i + 1
     endloop
     call TriggerAddCondition(trig, Condition(function Trig_Fireball_Conditions))
     call TriggerAddAction(trig, function Trig_Fireball_Actions)
     set trig = null
endfunction


 

DiabfallДата: Суббота, 01 Февраля 2014, 17:18:19 | Сообщение # 5
Группа: Проверенные
Сообщений: 1231
Награды: 0
Блокировки:
Эту функцию кидаешь выше.
Код
function Tree_winds_HurricaneCrug_FilterUnits takes nothing returns boolean
     return GetWidgetLife(GetFilterUnit())>.0 and IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) == false
endfunction


Код
...
call GroupEnumUnitsInRange(g,GetUnitX(ur),GetUnitY(ur),100.,function Tree_winds_HurricaneCrug_FilterUnits)
 

SirNikolasДата: Суббота, 01 Февраля 2014, 17:21:41 | Сообщение # 6
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Diabfall, исследования на wc3c показали, что проверка if'ом получается быстрее фильтра.

Добавлено (01 Февраля 2014, 17:21:41)
---------------------------------------------
И да,

Цитата Diabfall ()
call GroupEnumUnitsInRange(g, GetUnitX(ur), GetUnitY(ur), 100., Filter(function Tree_winds_HurricaneCrug_FilterUnits))


 

DiabfallДата: Суббота, 01 Февраля 2014, 17:22:31 | Сообщение # 7
Группа: Проверенные
Сообщений: 1231
Награды: 0
Блокировки:
Цитата SirNikolas ()
Diabfall, исследования на wc3c показали, что проверка if'ом получается быстрее фильтра.

последние исследования показали, что твои быстрее фильтра имеют значения когда комп табуретка)
 

SirNikolasДата: Суббота, 01 Февраля 2014, 17:26:00 | Сообщение # 8
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Но ведь удобнее, когда не надо перекидывать локалки из одной функции в другую)

Добавлено (01 Февраля 2014, 17:26:00)
---------------------------------------------
Imba_pvL, здесь много интересного.


 

DiabfallДата: Суббота, 01 Февраля 2014, 17:29:44 | Сообщение # 9
Группа: Проверенные
Сообщений: 1231
Награды: 0
Блокировки:
Цитата SirNikolas ()
И да,

у меня там GetFilterUnit(), это не нужно же, ибо потеряем драгоценную скорость)
 

SirNikolasДата: Суббота, 01 Февраля 2014, 17:31:05 | Сообщение # 10
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Ты не понял. Семейство GroupEnumUnits... принимает последним параметром filterfunc boolexpr, а ты передаешь code. Будет ошибка компиляции.



Сообщение отредактировал SirNikolas - Суббота, 01 Февраля 2014, 17:37:00
 

DiabfallДата: Суббота, 01 Февраля 2014, 17:40:36 | Сообщение # 11
Группа: Проверенные
Сообщений: 1231
Награды: 0
Блокировки:
Цитата SirNikolas ()
Будет ошибка компиляции.

Хм, почему у меня никогда её не было тогда?
 

Imba_pvLДата: Суббота, 01 Февраля 2014, 17:41:36 | Сообщение # 12
10 уровень
Группа: Проверенные
Сообщений: 3151
Награды: 1
Репутация: 1260
Блокировки:
И какой мне выбрать?) николаса или диабфала?

 

DiabfallДата: Суббота, 01 Февраля 2014, 17:44:09 | Сообщение # 13
Группа: Проверенные
Сообщений: 1231
Награды: 0
Блокировки:
Цитата Imba_pvL ()
И какой мне выбрать?) николаса или диабфала?

ника бери, у него там всё подробно расписано
 

Imba_pvLДата: Суббота, 01 Февраля 2014, 17:54:56 | Сообщение # 14
10 уровень
Группа: Проверенные
Сообщений: 3151
Награды: 1
Репутация: 1260
Блокировки:
Хорошо.
Спасибо, тему можно закрывать.
Сам если что разберусь.


 

DiabfallДата: Суббота, 01 Февраля 2014, 18:06:07 | Сообщение # 15
Группа: Проверенные
Сообщений: 1231
Награды: 0
Блокировки:
Цитата Imba_pvL ()
Сам если что разберусь.

Если не разберешься, пиши в гарене, не стесняйся.
 

Imba_pvLДата: Суббота, 01 Февраля 2014, 18:15:18 | Сообщение # 16
10 уровень
Группа: Проверенные
Сообщений: 3151
Награды: 1
Репутация: 1260
Блокировки:
Хорошо.

 

SirNikolasДата: Суббота, 01 Февраля 2014, 18:24:09 | Сообщение # 17
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Цитата Diabfall ()
Хм, почему у меня никогда её не было тогда?
Потому что у тебя cJass включен)


 

  • Страница 1 из 1
  • 1
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz