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

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

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

offline
Опыт: 3,543
Активность:
Передача данных в ф-ции
Привет всем, вот смотрите у меня всё время проблемы в передачей данных в функции. Т.к я использую локальные переменные я сохраняю в хеш и потом загружаю их в каждой функции.
Есть некоторый геморой, вот допустим если я сохраняю на ID таймера в хеш, то это понятно загрузить как это число, т.е

Код:
local timer t = GetExpiredTimer()
local integer id = GetHandleId(t)


и по числу 'id' я свободно могу загружать данные
А вот бывает так , я запускаю таймером функцию, а эта функция фильтрует условие ещё функцией, одной или 2 и тп допустим
вот пример

Код:
function Trig_MyFunc_Func001C takes nothing returns boolean
    return IsUnitInGroup(GetTriggerUnit(), udg_My_group) == true
    return IsUnitDeadBJ(GetTriggerUnit()) == false
endfunction

function Trig_MyFunc_Actions takes nothing returns nothing
    if ( Trig_MyFunc_Func001C() ) then
        call UnitDamageTargetBJ( GetTriggerUnit(), GetTriggerUnit(), 50.00, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL )
    else
    endif
endfunction


Вобщем вот я таймером запускаю функцию Trig_MyFunc_Action , там я могу сослаться на запомненых юнитов по id GetExpired таймера и вместо GetTriggerUnit поставить всё как нужно, а вот в проверке? Как мне туда загрузить то данные о юнита, GetExpiredTimer туда уже не действует вроде, что мне писать в Load(udg_hash,??,1)
Надеюсь вы меня поняли)
Старый 23.06.2012, 13:02
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
1.
function Trig_MyFunc_Func001C takes nothing returns boolean
    return IsUnitInGroup(GetTriggerUnit(), udg_My_group) == true
    return IsUnitDeadBJ(GetTriggerUnit()) == false
endfunction
Ты в курсе вообще что у тебя второе условие НИКОГДА не будет проверяться? Будет всегда возвращаться значение первого
Если уже надо проверять то вот так
function Trig_MyFunc_Func001C takes nothing returns boolean
    return IsUnitInGroup(GetTriggerUnit(), udg_My_group) and not IsUnitDeadBJ(GetTriggerUnit())
endfunction
2.Что мешает это условие вставить сразу в нижней функции?
То есть будет выглядеть вот так
function Trig_MyFunc_Actions takes nothing returns nothing
local unit u=LoadUnitHandle(udg_Hash,GetHandleId(GetExpiredTimer()),0)
if IsUnitInGroup(u, udg_My_group) and not IsUnitDeadBJ(u) then
        call UnitDamageTargetBJ( u, u, 50.00, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL )
endif
set u=null
endfunction
3.Заодно надо подчищать хеш-таблицу и таймер удалять
function Trig_MyFunc_Actions takes nothing returns nothing
local unit u=LoadUnitHandle(udg_Hash,GetHandleId(GetExpiredTimer()),0)
if IsUnitInGroup(u, udg_My_group) and not IsUnitDeadBJ(u) then
        call UnitDamageTargetBJ( u, u, 50.00, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL )
endif
	call FlushChildHashtable(udg_Hash,GetHandleId(GetExpiredTimer()))
	call DestroyTimer(GetExpiredTimer())
set u=null
endfunction

Отредактировано Nerevar, 23.06.2012 в 13:54.
Старый 23.06.2012, 13:38
EviLInside

offline
Опыт: 3,543
Активность:
1.3 пункт это понятно, я для примера кинул. Так ладно это я тупанул, неудачный пример, а если там действие не дамаг наносить а пикать юнита в группу? Там точно в 1 функцию никак вроде не вставишь!

ЧИТАТЬ СНИЗУ ВВЕРХ ЕСТЕСТВЕННО.

Код:
function MyFunc2Cond takes nothing returns boolean ( НУ А СЮДА И ПОДАВНУ НУЖЕН И ГРУППУ И ЮНИТ КАСТЕР ЗАГРУЖЕНЫЙ ЧТО Б ПРОВЕРЯТЬ)
    if ( not ( IsUnitEnemy(GetEnumUnit(), GetOwningPlayer(udg_My_unit)) == true ) ) then
        return false
    endif
    if ( not ( IsUnitDeadBJ(GetEnumUnit()) == false ) ) then
        return false
    endif
    if ( not ( IsUnitType(GetEnumUnit(), UNIT_TYPE_STRUCTURE) == false ) ) then
        return false
    endif
    if ( not ( IsUnitInGroup(GetEnumUnit(), udg_My_group) == false ) ) then
        return false
    endif
    return true
endfunction

function MyFunc2Act takes nothing returns nothing (СЮДА НАДО ЗАГРУЖАТЬ ГРУППУ ДЛЯ ДОБАВЛЕНИЯ ТУДА ЮНИТА, КАК? ОТ GetExpiredTimer не оттолкнёшся, а где взять число?)
    if ( MyFunc2Cond() ) then
        call GroupAddUnitSimple( GetEnumUnit(), FA_Group )
    else
    endif
endfunction

function MyFunc2 takes nothing returns nothing  (ВОТ СЮДА ВСЁ НОРМ ЗАГРУЗИТСЯ, ОК)
     local timer FA_Timer = GetExpiredTimer()
     local integer FA_TimerId = GetHandleId(FA_Timer)
     call LoadUnitHandle(udg_hash,FA_TimerId,2)   
    call ForGroupBJ( GetUnitsInRangeOfLocAll(500.00, GetUnitLoc(FA_Caster)), function MyFunc2Act )
endfunction

function MyFunc takes nothing returns nothing
local timer FA_Timer = CreateTimer()
local group FA_Group 
local integer FA_TimerId = GetHandleId(FA_Timer)
local unit FA_Caster = GetSpellAbilityUnit()
call SaveUnitHandle(udg_hash,FA_TimerId,1,FA_Caster)
call SaveGroupHandle (udg_hash,FA_TimerId,2,FA_Group) 
call TimerStart(FA_Timer,0.05,true,function MyFunc2)
endfunction

Отредактировано EviLInside, 23.06.2012 в 14:31.
Старый 23.06.2012, 14:12
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
Кидай код или точно опиши что тебе надо - посмотрим
Старый 23.06.2012, 14:16
EviLInside

offline
Опыт: 3,543
Активность:
Выше смотрите , на сам код не смотрите особо это я для прмера щас клепал, если там переменная неправильна или чё то не дописано, МНЕ ГЛАВНОЕ СМЫСЛ КАК СДЕЛАТЬ.
Старый 23.06.2012, 14:28
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
Для такого использования форгуппа нужна глобалка,если хотите действия с группой смотрите эту тему
Там внизу я показал пример перебора группы в одной функции - не придется юзать глоабалки,все в одном месте и удобно
Старый 23.06.2012, 14:39
EviLInside

offline
Опыт: 3,543
Активность:
Щас вот подумал, а если передавать значение в те две функции?

Вот в MyFunc2 я узнал id для загрузки из хеша с помощью GetExpiredTimer
и в этой же функции написать
call MyFuncAct(FA_TimedId)
call MyFuncCond(FA_TimedId)


и те функции что б давали
function MyFunc2Act takes integer FA_TimedId .....
function MyFunc2Cond takes integer FA_TimedId....
Ну и спокойно грузить... Прокатит?
Старый 23.06.2012, 14:51
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
В функции вызываемые командой ForGroup нельзя передавать никаких значений напрямую
Юзай метод по ссылке которую давал если хочешь
Старый 23.06.2012, 15:05
EviLInside

offline
Опыт: 3,543
Активность:
Если честно я несовсем понял твой пример просто...
Старый 23.06.2012, 15:11
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
...
local group Group = CreateGroup()//создаем группу
local unit caster=LoadUnitHandle(udg_Hash,id,0)//тут юнит загружается по айди таймера
local unit Picked// юнит для группы
...
call GroupEnumUnitsInRange(Group,X,Y,120,null)//берем в группу юнитов в радиусе 120 от координат  
//каких-то
loop//начинается цикл по группе
set Picked = FirstOfGroup(Group)//устанавливаем переменную юнита=первому юниту в группе
exitwhen  Picked == null//если первый юнит в группе отсутствует значит группа уже пуста
//и выходим из цикла
if (нужное условие на совпадение типа целей в группе,например что юнит враг,живой итд) then
//	тут действия над юнитом в группе,например нанесение ему урона от лица загруженного юнита
//или добавление юнита в другую группу
endif
call GroupRemoveUnit(Group,Picked)//удаляем юнита из группы,дабы проверить всех юнитов в группе
//и цикл не был вечным
endloop//конец цикла
...
call DestroyGroup(Group)//удаляем группу
set Group = null//обнуляем переменные
set caster=null
set Picked=null
Старый 23.06.2012, 15:29
EviLInside

offline
Опыт: 3,543
Активность:
Спасибо, всё получается)
Старый 23.06.2012, 15:39
Закрытая тема

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

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

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

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



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