|
|
|
|
[Вопрос] Создание простого заклинания
|
|
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 включен)
|
|
|
|
|
|
|
|
|
|
|