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

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

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

offline
Опыт: 442
Активность:
Не пикает юнитов в группу ;[
Создается дамми который летит на определенное расстояние в направлении точки каста, и в радиусе 150 от дамми нужно пикать юнитов, и наносить урон.
но юниты не пикаются ;[
В чем может быть проблема?
((код jass
function arrow_cond takes nothing returns boolean
return GetSpellAbilityId() == 'A00B'
endfunction
function FilterUnit takes nothing returns boolean
return IsPlayerEnemy(GetOwningPlayer(GetSpellAbilityUnit()),GetOwningPlayer(GetFilterUnit())) and GetWidgetLife(GetFilterUnit())>=0.405 and not IsUnitType(GetFilterUnit(),UNIT_TYPE_STRUCTURE) and not IsUnitType(GetFilterUnit(),UNIT_TYPE_MAGIC_IMMUNE)and not IsUnitType(GetFilterUnit(),UNIT_TYPE_FLYING)
endfunction
function arrow_damage takes nothing returns nothing
local integer lvl = GetUnitAbilityLevel(GetSpellAbilityUnit(), 'A00B')
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Other\\ImmolationRed\\ImmolationRedDam​age.mdl", GetEnumUnit(), "overhead"))
call UnitDamageTargetBJ( GetSpellAbilityUnit(), GetEnumUnit(), (40*I2R(lvl)), ATTACK_TYPE_MAGIC, DAMAGE_TYPE_FIRE )
endfunction
function arrow_move takes nothing returns nothing
local integer i = GetHandleId(GetExpiredTimer())
local unit d = LoadUnitHandle(udg_h, i, 0)
local real a = LoadReal(udg_h, i, 1)
local real x2 = GetUnitX(d) + 20.00 * Cos(a*bj_DEGTORAD)
local real y2 = GetUnitY(d) + 20.00 * Sin(a*bj_DEGTORAD)
local real x = LoadReal(udg_h, i, 2)
local real y = LoadReal(udg_h, i, 3)
local real dist = SquareRoot((x2-x)*(x2-x)+(y2-y)*(y2-y))
local group g = CreateGroup()
call GroupEnumUnitsInRange(g, GetUnitX(d), GetUnitY(d), 150, Condition(function FilterUnit))
call ForGroup(g, function arrow_damage)
if dist < 1800 then
call SetUnitPosition(d, x2, y2)
else
call RemoveUnit(d)
endif
call DestroyGroup(g)
set g = null
set d = null
endfunction
function arrow_act takes nothing returns nothing
local timer t = CreateTimer()
local unit c = GetSpellAbilityUnit()
local real cx = GetUnitX(c)
local real cy = GetUnitY(c)
local real tx = GetLocationX(GetSpellTargetLoc())
local real ty = GetLocationY(GetSpellTargetLoc())
set udg_h=InitHashtable()
call SaveUnitHandle(udg_h, GetHandleId(t), 0, CreateUnit(GetOwningPlayer(c), 'h003',cx , cy, bj_RADTODEG*Atan2(ty-cy,tx-cx) ))
call SaveReal(udg_h, GetHandleId(t), 1, bj_RADTODEG*Atan2(ty-cy,tx-cx))
call SaveReal(udg_h, GetHandleId(t), 2, GetUnitX(GetSpellAbilityUnit()))
call SaveReal(udg_h, GetHandleId(t), 3, GetUnitY(GetSpellAbilityUnit()))
call TimerStart(t, 0.03125, true, function arrow_move)
set t = null
set c = null
endfunction
function InitTrig_Arrow takes nothing returns nothing
local trigger t = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_SPELL_CAST)
call TriggerAddCondition(t, Condition(function arrow_cond))
call TriggerAddAction(t, function arrow_act)
endfunction
))

Отредактировано freest, 01.02.2012 в 18:09.
Старый 01.02.2012, 18:02
alexprey
познающий Unity
offline
Опыт: 68,501
Активность:
GetTriggerUnit()
ниче не вернет. Вот в этом и ошибка

alexprey добавил:
Ну я про фильр
Старый 01.02.2012, 18:06
freest

offline
Опыт: 442
Активность:
alexprey, заменил на GetSpellAbilityUnit()
результат тот же
Старый 01.02.2012, 18:08
alpha

offline
Опыт: 7,387
Активность:
В фильтре функция GetSpellAbilityUnit() и GetTriggerUnit() возвращает null, насколько я знаю. Делай через переменную
Старый 01.02.2012, 18:13
freest

offline
Опыт: 442
Активность:
и как через переменную ?

Отредактировано freest, 01.02.2012 в 18:19.
Старый 01.02.2012, 18:13
alpha

offline
Опыт: 7,387
Активность:
Заноси при касте его в хэш, перед фильтром заноси в переменную.
   SaveUnitHandle(udg_h, GetHandleId(t), 4, c)
//===

globals
   unit Unit13 = null
endglobals

function FilterUnit takes nothing returns boolean
    return IsPlayerEnemy(GetOwningPlayer(Unit13),GetOwningPlayer(GetFilterUnit())) and GetWidgetLife(GetFilterUnit())>=0.405 and not IsUnitType(GetFilterUnit(),UNIT_TYPE_STRUCTURE) and not IsUnitType(GetFilterUnit(),UNIT_TYPE_MAGIC_IMMUNE)and not IsUnitType(GetFilterUnit(),UNIT_TYPE_FLYING)
endfunction

   set Unit13 = LoadUnitHandle(udg_h, i, 4)
   GroupEnumUnitsInRange(g, GetUnitX(d), GetUnitY(d), 150, Condition(function FilterUnit))
   set Unit13 = null
Да и функции GetSpellAbilityUnit() и GetTriggerUnit() в функции которая запускается таймером изначально не должно быть
Старый 01.02.2012, 18:28
freest

offline
Опыт: 442
Активность:
мм, globals - хз куда это писать, Jass2 не юзаю.
Использовал по типу: set udg_u = LoadUnitHandle(udg_h, i, 4)
начал пикать, спасибо, клоуз
Старый 01.02.2012, 18:32
alpha

offline
Опыт: 7,387
Активность:
Используй как тебе удобнее, я выразил суть алгоритма, который тут должен быть
Закрыто
Старый 01.02.2012, 18:40
Закрытая тема

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

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

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

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



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