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

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

Закрытая тема
 
Sladkoegka
Забыл что хотел...
offline
Опыт: 7,437
Активность:
Пик юнитов в отряде и хэш-таблица
В общем начал изучать Хэш-Таблицы и перевел 2 своих триггеров с глобалками в 1 триггер с хэш таблицей.
Вот проблемный кусок кода:
» КОД
-------------------------------
function Trig_Collision_flight_Move_ForGroup
local unit u = GetFilterUnit()
local real xu = GetUnitX(u)
local real yu = GetUnitY(u)
local unit caster //-------------------вот ОНО
local real angle = Atan2(GetUnitY(caster) - yu, GetUnitX(caster) -  xu)
    if IsUnitEnemy(u, GetOwningPlayer(caster)) and GetUnitState(u, UNIT_STATE_LIFE) > 0.405 and not IsUnitType(u, UNIT_TYPE_STRUCTURE) then
       !!Всяческие действия с кастером и пикнутым юнитом!!
    endif
set u = null
return false
endfunction
----------------------------

-----------------------------
function Trig_Collision_flight_Move_Actions
..................
local timer t = GetExpiredTimer()
local integer h = GetHandleId(t)
local unit caster = LoadUnitHandle(udg_hash,h,1)
call GroupEnumUnitsInRange(g,x,y,125, Filter(function Trig_Collision_flight_Move_ForGroup))
--------------------------

-----------------------------------
Trig_Collision_flight_Actions
local unit caster = GetSpellAbilityUnit()
local timer t = CreateTimer()
local integer h = GetHandleId(t)
call SaveUnitHandle(udg_hash,h,1,caster)
call TimerStart(t,0.04,true,function Trig_Collision_flight_Move_Actions)
------------------------------
И я не знаю как достать юнита "caster" в функции function Trig_Collision_flight_Move_ForGroup .Он у меня записан на ID таймера,но ведь когда пикаются юниты вокруг кастера никакие таймеры не истекают...получается что пик юнита реагирует только на самого "выбранного юнита"...В общем я запутался, прошу помочь.
Добавлю на всякий случай свой угокод
» Не для слабонервных
function Trig_Collision_flight_Move_ForGroup takes nothing returns boolean
local unit u = GetFilterUnit()
local real xu = GetUnitX(u)
local real yu = GetUnitY(u)
local unit caster 
local real angle = Atan2(GetUnitY(caster) - yu, GetUnitX(caster) -  xu)
    if IsUnitEnemy(u, GetOwningPlayer(caster)) and GetUnitState(u, UNIT_STATE_LIFE) > 0.405 and not IsUnitType(u, UNIT_TYPE_STRUCTURE) then
        call SetUnitPosition( u, xu - 10.00 * Cos(angle), yu - 10.00 * Sin(angle))
        call UnitDamageTarget(caster, u, ( 10.00 * I2R(GetUnitAbilityLevel(caster, 'A004' )) ), true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS )
        call UnitDamageTarget(caster, caster, ( 2.00 * I2R(GetUnitAbilityLevel(caster, 'A004' )) ),true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS )
        call AddSpecialEffectTarget( "Objects\\Spawnmodels\\Human\\HumanBlood\\HumanBloodSorceress.mdl",u,"chest" )
    endif
set u = null
return false
endfunction

function Trig_Collision_flight_Move_Actions takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer h = GetHandleId(t)
local unit caster = LoadUnitHandle(udg_hash,h,1)
local real xC = GetUnitX(caster)
local real yC = GetUnitY(caster)
local real my_end_x = LoadReal(udg_hash,h,2)
local real my_end_y = LoadReal(udg_hash,h,3)
local real angle = Atan2(my_end_y - yC, my_end_x -  xC)
local real x = xC + 25.00 * Cos( angle )
local real y = yC + 25.00 * Sin( angle )
local integer I = LoadInteger(udg_hash,h,4)
local group g = CreateGroup()
if I==5 then
        call SetUnitFlyHeight( caster, 220.00, 375.00 )
        call SetUnitPathing( caster, true )
    endif
if I>0 then
    call SetUnitPosition( caster, x,y )
    call GroupEnumUnitsInRange(g,x,y,125, Filter(function Trig_Collision_flight_Move_ForGroup))
    call SaveInteger(udg_hash,h,4,I-1)
else
call DestroyTimer(t)
call FlushChildHashtable(udg_hash,h)
endif
set caster = null
set t = null
call GroupClear(g) 
call DestroyGroup(g)
set g = null
endfunction


function Trig_Collision_flight_Actions takes nothing returns nothing
local real distance
local unit caster = GetSpellAbilityUnit()
local location loc = GetUnitLoc(caster)
local real x = GetUnitX(caster)
local real y = GetUnitY(caster)
local real my_end_x
local real my_end_y
local integer I = GetUnitAbilityLevel(caster, 'A004')
local timer t = CreateTimer()
local integer h = GetHandleId(t)
    call SaveUnitHandle(udg_hash,h,1,caster)
    set my_end_x = GetLocationX(GetSpellTargetLoc())
    set my_end_y = GetLocationY(GetSpellTargetLoc())
    set my_end_x = GetUnitX(GetSpellTargetUnit())
    set my_end_y = GetUnitY(GetSpellTargetUnit())
    call SaveReal(udg_hash,h,2,my_end_x)
    call SaveReal(udg_hash,h,3,my_end_y)
    set distance = SquareRoot((my_end_x - x) * (my_end_x - x) + (my_end_y - y) * (my_end_y - y))
    call SetUnitFacing(caster,  bj_RADTODEG * Atan2(my_end_y - y, my_end_x - x))
    if distance >= 300.00 then
        call SaveInteger(udg_hash,h,4,(R2I(distance/25)))
        call TimerStart(t,0.04,true,function Trig_Collision_flight_Move_Actions)
        call SetUnitFlyHeight(caster, 70.00, 750.00 )
        call SetUnitFlyHeight(caster, 70.00, 750.00 )
        call SetUnitPathing(caster, false )
    else
        call UnitRemoveAbility( caster ,'A004')
        call UnitAddAbility( caster ,'A004' )
        call SetUnitAbilityLevel( caster ,'A004',I )
        call SetUnitState( caster,UNIT_STATE_MANA, GetUnitState(caster, UNIT_STATE_MANA) + 90.00  )
    endif
set caster = null
set t = null
endfunction

function Trig_Collision_flight_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A004'
endfunction

//===========================================================================
function InitTrig_Collision_flight takes nothing returns nothing
    set gg_trg_Collision_flight = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Collision_flight, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_Collision_flight, Condition( function Trig_Collision_flight_Conditions ) )
    call TriggerAddAction( gg_trg_Collision_flight, function Trig_Collision_flight_Actions )
endfunction

Отредактировано Sladkoegka, 25.06.2012 в 11:55.
Старый 25.06.2012, 11:48
EviLInside

offline
Опыт: 3,543
Активность:
Сам недавно тока разобрался, тоже бесило это. Мне помогли, вобщем надо юзать луп по группе.
Код:
function ТВОЯ ФУНКЦИЯ КОТОРАЯ ТАЙМЕРОМ ЗАПУСКАЕТСЯ takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer it = GetHandleId(t)
local group Group = CreateGroup()//создаем группу
local unit caster=LoadUnitHandle(udg_Hash,it,0)//тут юнит загружается по айди таймера
local unit Picked// юнит для группы в которой перебираеш
call GroupEnumUnitsInRange(Group,X,Y,120,null)//берем в группу юнитов в радиусе 120 от координат  
//каких-то (берешь юнитов в группу и цикл будет по 1 с каждым из них действия делать,затем удалять из группы и так пока группа не будет пустой)
loop//начинается цикл по группе
set Picked = FirstOfGroup(Group)//устанавливаем переменную юнита=первому юниту в группе (он там один - первый юнит)
exitwhen  Picked == null//если первый юнит в группе отсутствует значит группа уже пуста
//и выходим из цикла
if (нужное условие на совпадение типа целей в группе,например что юнит враг,живой итд) then
//    тут действия над юнитом в группе,например нанесение ему урона от лица загруженного юнита
//или добавление юнита в другую группу, либо там сам решишь что ещё
endif
call GroupRemoveUnit(Group,Picked)//удаляем юнита из группы,что бы в группе не накапливалось больше 1 юнита.
endloop//конец цикла
...
call DestroyGroup(Group)//удаляем группу
set Group = null//обнуляем переменные
set caster=null
set Picked=null

Отредактировано Nerevar, 25.06.2012 в 14:43.
Старый 25.06.2012, 12:00
Sladkoegka
Забыл что хотел...
offline
Опыт: 7,437
Активность:
EviLInside, Огромное тебе спасибо,все расписал с комментами и понятно.Все робит отлично, еще раз спасибо.Тему уже можно закрывать, полный ответ был получен.
Старый 25.06.2012, 13:48
EviLInside

offline
Опыт: 3,543
Активность:
Ну скорее больше спасибо наверное Nerevar'у =) я ему тоже благодарен
Старый 25.06.2012, 14:08
adic3x

offline
Опыт: 107,539
Активность:
Немного пропаганды cJass:
hashtable HASH = InitHashtable ();
enum {HASH_ID} // ключ для безопасного доступа

callback onInit () {
    timer t = CreateTimer ();
    group g = CreateGroup ();
    SaveGroupHandle (HASH, GetHandleId (t), HASH_ID, g)
    GroupAddUnit (g, CreateUnit (Player(0), 'Hpal', 0., 0., 0.)) // Добавляем юнитов в группу, к примеру палыча
    TimerStart (t, 1., true, lambda nothing () {
        for (unit u; UnitsInGroup (LoadGroupHandle(HASH, GetHandleId(GetExpiredTimer()), HASH_ID))) {
            DestroyEffect(AddSpecialEffectTarget("Objects\\Spawnmodels\\Undead\\ImpaleTargetDust\\ImpaleTar​getDust.mdl", u, "origin"))
        }
    });
}
Старый 25.06.2012, 14:39
Закрытая тема

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

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

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

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



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