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

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

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

offline
Опыт: 1,162
Активность:
Не добавляются в группу юниты
Запускается таймер с периодом 0.08 на выполнение вот этой функции
Даммик движется эффекты проявляются но в группу упорно не добавляются юниты. Помогите понять почему
function Banshee_ult_Main takes nothing returns nothing
local timer Timer = GetExpiredTimer()
local unit Caster = LoadUnitHandle(udg_h,GetHandleId(Timer),1)
local unit Dummy = LoadUnitHandle(udg_h,GetHandleId(Timer),2)
local real r = LoadReal(udg_h,GetHandleId(Timer),3)
local real teta = LoadReal(udg_h,GetHandleId(Timer),4)
local integer n = LoadInteger(udg_h,GetHandleId(Timer),5)
local effect ef = LoadEffectHandle(udg_h,GetHandleId(Timer),6)
local group Group = LoadGroupHandle(udg_h,GetHandleId(Timer),7)
local boolexpr b=Condition(function Banshee_ult_Filter)
local unit f = null
set n = n+1
if n == 100 then
call IssueImmediateOrderById(Caster,OrderId("stop"))
call RemoveUnit(Dummy)
call DestroyEffect(ef)
call DestroyTimer(Timer)
else
set teta = teta + 3.14/18
set r = r+7
call SetUnitX(Dummy,GetUnitX(Caster)+r*Cos(teta))
call SetUnitY(Dummy,GetUnitY(Caster)+r*Sin(teta))
call AddSpecialEffectLoc("Abilities\\Spells\\Undead\\AnimateDead\\AnimateDeadTarget.mdl",GetUni​tLoc(Dummy))
loop       
    set f = FirstOfGroup(Group)
    exitwhen f == null
    call DisplayTextToForce( GetPlayersAll(), "3" )
    call UnitDamageTarget(Dummy,f, 100, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_MAGIC, null)    
    call GroupRemoveUnit(Group, f)
endloop  
call DestroyGroup(Group)
call SaveReal(udg_h, GetHandleId(Timer),3,r)
call SaveReal(udg_h, GetHandleId(Timer),4,teta)
call SaveInteger(udg_h, GetHandleId(Timer),5,n)
endif
call GroupEnumUnitsInRange(Group,GetUnitX(Caster)+r*Cos(teta),GetUnitY(Caster)+r*Sin(teta),750.,b)
if FirstOfGroup(Group) == null then
call DisplayTextToForce( GetPlayersAll(), "No" )
else
call DisplayTextToForce( GetPlayersAll(), "Yes" )
endif
call SaveGroupHandle(udg_h, GetHandleId(Timer),7,Group)
set Group = null
set Dummy = null
set Caster = null
set Timer = null
set b = null
endfunction
Старый 27.03.2011, 17:51
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
эм а где функция добавления юнита в группу? удаление есть, а добавления нет
Старый 27.03.2011, 17:53
Doc

offline
Опыт: 63,163
Активность:
когда делаешь Enum группа очищается.
Старый 27.03.2011, 17:54
Dartesk

offline
Опыт: 1,162
Активность:
>эм а где функция добавления юнита в группу? удаление есть, а добавления нет
call GroupEnumUnitsInRange(Group,GetUnitX(Caster)+r*Cos(teta),GetUnitY(Caster)+r*Sin(teta),750.,b)
где условие б
function Banshee_ult_Filter takes nothing returns boolean
local unit f=GetFilterUnit()
if IsPlayerEnemy(GetOwningPlayer(GetTriggerUnit()),GetOwningPlayer(f)) and GetWidgetLife(f)>=0.405 and IsUnitType(f,UNIT_TYPE_STRUCTURE)==false then
set f=null
return true
else
set f=null
return false
endif
endfunction
>когда делаешь Enum группа очищается.
хм а как тогда мне записывать в этом цикле в группу юнитов?
Dartesk добавил:
ибо когда я делал однократно (т.е. собирал юнитов в группу до таймера в разделе Action) то все работало а так даже если в таймере поставить однокре=атное выполнение в группу юниты не собираются(
Старый 27.03.2011, 18:07
spellwerk

offline
Опыт: 4,869
Активность:
омг что это за код
endloop  
call DestroyGroup(Group) // <<< смотрим сюда
call SaveReal(udg_h, GetHandleId(Timer),3,r)
call SaveReal(udg_h, GetHandleId(Timer),4,teta)
call SaveInteger(udg_h, GetHandleId(Timer),5,n)
endif
// а потом сюда vvvv
call GroupEnumUnitsInRange(Group,GetUnitX(Caster)+r*Cos(teta),GetUnitY(Caster)+r*Sin(teta),750.,b)
if FirstOfGroup(Group) == null then
и понимаем, что производим действия с несозданным объектом
Spy_ добавил:
и на будущее: если выкладываете код, то постарайтесь пожалуйста, чтобы он был читаемым не только вам; хотя бы расставляйте табуляцию в действиях циклов, ифов, етц.
Spy_ добавил:
local group Group = LoadGroupHandle(udg_h,GetHandleId(Timer),7)
может эта группа не создана
Старый 27.03.2011, 18:27
Dartesk

offline
Опыт: 1,162
Активность:
Ну вообщем вот со всем подписями табами и прочим-там с дестройем группы я неудачный пример выложил. Этот пример я попытался сделать с ForGroup но результат такой же никакой
function Banshee_ult_Conditions takes nothing returns boolean
return( GetSpellAbilityId() == 'A007' )
endfunction

function Banshee_ult_Filter takes nothing returns boolean
local unit f=GetFilterUnit()
//Тут как бы у меня фильтр на враг или нет и живой или нет и не является зданием соответственно
if IsPlayerEnemy(GetOwningPlayer(GetTriggerUnit()),GetOwningPlayer(f)) and GetWidgetLife(f)>=0.405 and IsUnitType(f,UNIT_TYPE_STRUCTURE)==false then
    set f=null
    return true
    else
    set f=null
    return false
endif
endfunction


function Banshee_ult_Damage takes nothing returns nothing
    //Это как бы предполагается функция в которой в ранее созданной группе беретя юнит этому юниту наносится урон
    // и если все это произошло выводится сообщение Yes
    local timer Timer = GetExpiredTimer()
    local group Group = LoadGroupHandle(udg_h,GetHandleId(Timer),7)
    local unit f = FirstOfGroup(Group)
    call UnitDamageTarget(GetTriggerUnit(),f, 100, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_MAGIC, null) 
    call GroupRemoveUnit(Group, f)
    call DisplayTextToForce( GetPlayersAll(), "Yes" )
endfunction

function Banshee_ult_Main takes nothing returns nothing
//вызов переменных
local timer Timer = GetExpiredTimer()
local unit Caster = LoadUnitHandle(udg_h,GetHandleId(Timer),1)
local unit Dummy = LoadUnitHandle(udg_h,GetHandleId(Timer),2)
local real r = LoadReal(udg_h,GetHandleId(Timer),3)
local real teta = LoadReal(udg_h,GetHandleId(Timer),4)
local integer n = LoadInteger(udg_h,GetHandleId(Timer),5)
local effect ef = LoadEffectHandle(udg_h,GetHandleId(Timer),6)
local group Group = CreateGroup()
local boolexpr b=Condition(function Banshee_ult_Filter)
local unit f = null
//прибавляю +1 к переменной считающей сколько циклов прошло
set n = n+1
//как бы пытаюсь добавить юнитов в радиусе 350 от точки нахождения даммика в данный момент
call GroupEnumUnitsInRange(Group,GetUnitX(Caster)+r*Cos(teta),GetUnitY(Caster)+r*Sin(teta),350.,b)
//и сохраняю в хеш
call SaveGroupHandle(udg_h, GetHandleId(Timer),7,Group)
//ну и тут как бы пытаюсь совершить над юнитами в группе действие (т.е нанести им урон)
call ForGroup(Group, function Banshee_ult_Damage)
call DestroyGroup(Group)
    if n == 100 then
    //тут по прошествии ста циклов даммик и таймер уничтожаются а кастеру дается приказ "стоп"
        call IssueImmediateOrderById(Caster,OrderId("stop"))
        call RemoveUnit(Dummy)
        call DestroyEffect(ef)
        call DestroyTimer(Timer)
    else
        //Тут у меня вызывается созданный даммик который носится по спирали, радиус которой меняет на 7 за 0.08 а угол на пи деленное на 18
        // каждый раз на месте даммика вызывается эффект "гальванизация"
        set teta = teta + 3.14/18
        set r = r+7
        call SetUnitX(Dummy,GetUnitX(Caster)+r*Cos(teta))
        call SetUnitY(Dummy,GetUnitY(Caster)+r*Sin(teta))
        call AddSpecialEffectLoc("Abilities\\Spells\\Undead\\AnimateDead\\AnimateDeadTarget.mdl",GetUni​tLoc(Dummy))
        call SaveReal(udg_h, GetHandleId(Timer),3,r)
        call SaveReal(udg_h, GetHandleId(Timer),4,teta)
        call SaveInteger(udg_h, GetHandleId(Timer),5,n)
        endif
set Group = null
set Dummy = null
set Caster = null
set Timer = null
set b = null
endfunction


function Banshee_ult_Actions takes nothing returns nothing
local unit Caster = GetSpellAbilityUnit()
local unit Dummy = CreateUnit(GetOwningPlayer(Caster),'o000',GetUnitX(Caster),GetUnitY(Caster), bj_UNIT_FACING)
local timer Timer = CreateTimer()
local real r = 0
local real teta = 0
local integer n = 0
local boolexpr b=Condition(function Banshee_ult_Filter)
//добавляю кастеру эффект на все время каста
local effect ef = AddSpecialEffectLoc("Abilities\\Spells\\Undead\\Unsummon\\UnsummonTarget.mdl",GetUnitLoc(C​aster))
//сохранение переменных
call SaveUnitHandle(udg_h,GetHandleId(Timer),1,Caster)
call SaveUnitHandle(udg_h,GetHandleId(Timer),2,Dummy)
call SaveReal(udg_h, GetHandleId(Timer),3,r)
call SaveReal(udg_h, GetHandleId(Timer),4,teta)
call SaveInteger(udg_h, GetHandleId(Timer),5,n)
call SaveEffectHandle(udg_h, GetHandleId(Timer),6,ef)
call TimerStart(Timer,0.08,true,function Banshee_ult_Main)
set Dummy = null
set Caster = null
set Timer = null
endfunction

//===========================================================================
function InitTrig_Banshee_ult takes nothing returns nothing
    local trigger trg=CreateTrigger()
    set udg_h=InitHashtable()
    call TriggerAddCondition( trg, Condition( function Banshee_ult_Conditions ) )
    call TriggerRegisterAnyUnitEventBJ( trg, EVENT_PLAYER_UNIT_SPELL_CAST )
    call TriggerAddAction( trg, function Banshee_ult_Actions )
    set trg=null
endfunction
Dartesk добавил:
впринципе если на то пошло такая вот банальщина (кастер кастует юниты дамажатся) при создании группы в функции запущенной таймером тоже не работает

function Banshee_ult_Main takes nothing returns nothing
local timer Timer = GetExpiredTimer()
local unit Caster = LoadUnitHandle(udg_h,GetHandleId(Timer),1)
local group Group = CreateGroup()
local boolexpr b=Condition(function Banshee_ult_Filter)
local unit f = null
call GroupEnumUnitsInRange(Group,GetUnitX(Caster),GetUnitY(Caster),350.,b)
loop       
    set f = FirstOfGroup(Group)
    exitwhen f == null
    call DisplayTextToForce( GetPlayersAll(), "3" )
    call UnitDamageTarget(Caster,f, 100, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_MAGIC, null)    
    call GroupRemoveUnit(Group, f)
endloop  
set Group = null
set Caster = null
set Timer = null
set b = null
endfunction


function Banshee_ult_Actions takes nothing returns nothing
local unit Caster = GetSpellAbilityUnit()
local timer Timer = CreateTimer()
local real r = 0
local real teta = 0
local integer n = 0
local boolexpr b=Condition(function Banshee_ult_Filter)
call SaveUnitHandle(udg_h,GetHandleId(Timer),1,Caster)
call TimerStart(Timer,0.08,false,function Banshee_ult_Main)
set Caster = null
set Timer = null
endfunction
Старый 27.03.2011, 19:47
JimALIEN
вдупляет sc2 editor
offline
Опыт: 7,176
Активность:
call ForGroup(g,f) вроде как по сути вызывает функцию цикла, где для каждого юнита из группы g будет выполняться функция f, т.е. в функции Banshee_ult_Damage тебе нужно просто нанести урон по GetEnumUnit(), но твой фейл в том, что у тебя этот урон наносит GetTriggerUnit(), т.к. уже после первого истечения таймера это будет null. Загружай кастера из хеш-таблицы вобщем
Старый 28.03.2011, 05:33
Dartesk

offline
Опыт: 1,162
Активность:
JimALIEN:
call ForGroup(g,f) вроде как по сути вызывает функцию цикла, где для каждого юнита из группы g будет выполняться функция f, т.е. в функции Banshee_ult_Damage тебе нужно просто нанести урон по GetEnumUnit(), но твой фейл в том, что у тебя этот урон наносит GetTriggerUnit(), т.к. уже после первого истечения таймера это будет null. Загружай кастера из хеш-таблицы вобщем
Точно не помню, но по-моему я и кастера с хеш-таблицы и даммика с хеш-таблицы туда ставил и результат был тот же. А так я в результате просто в каждом тике таймера давал и удалял способность, сделанную на основе веерного броска, у даммика и давал даммику соответствующий приказ. Так что все заработало ну кроме той же проблемы что и в предыдущей теме)
Старый 28.03.2011, 09:33
spellwerk

offline
Опыт: 4,869
Активность:
перепиши код заного
иногда помогает
Старый 28.03.2011, 09:44
JimALIEN
вдупляет sc2 editor
offline
Опыт: 7,176
Активность:
ну условие у тебя тож по таймеру запускаеца, а там тот же GetTriggerUnit() мб, там забыл сменить... Вобще условие странно используеца... В первой функции так его вобще объявлять необязательно, а потом оно используеца только по таймеру
function Banshee_ult_Filter takes nothing returns boolean
return IsPlayerEnemy(GetOwningPlayer(LoadUnitHandle(udg_h,GetHandleId(GetExpiredTimer()),1)),GetOwningPlaye​r(GetFilterUnit())) and GetWidgetLife(GetFilterUnit())>=0.405 and IsUnitType(GetFilterUnit(),UNIT_TYPE_STRUCTURE)==false
endfunction
кажись так полуше будет
а функцию Banshee_ult_Damage замени на
function Banshee_ult_Damage takes nothing returns nothing
    call UnitDamageTarget(LoadUnitHandle(udg_h,GetHandleId(GetExpiredTimer()),1),GetEnumUnit(), 100, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_MAGIC, null) 
endfunction
Старый 28.03.2011, 10:22
Dartesk

offline
Опыт: 1,162
Активность:
JimALIEN, да наверное тут я и ошибся) ну сейчас я переделывать не буду ибо веерный бросок вполне устраивает в конкретном спеле(ибо меньше действий выходит), а на будущее учту. спс)
Старый 28.03.2011, 12:03
Закрытая тема

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

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

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

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



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