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

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

Закрытая тема
 
Vadik29
Choice Battle 1.6а
offline
Опыт: 15,845
Активность:
Пересохранение
При пересохранении реальной z создается ли утечка, и почему не работает условие if(h>6 or mx!=m)then

function Trig_Spell_Conditions takes nothing returns boolean
        return GetSpellAbilityId() == 'A000'
endfunction

function Trig_Spell_Actions2 takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer id = GetHandleId(t)
local unit u = LoadUnitHandle(udg_Hash,id,0)
local unit d = LoadUnitHandle(udg_Hash,id,1)
local real z = LoadReal(udg_Hash,id,2)
local real m = GetUnitState(u,UNIT_STATE_MANA)
local real mx = GetUnitState(u,UNIT_STATE_MAX_MANA)
local real h = GetUnitState(u,UNIT_STATE_LIFE)
local real x = GetUnitX(u)
local real y = GetUnitY(u)
local effect e
local string s = "Abilities\\Spells\\Items\\AIma\\AImaTarget.mdl"
if(h>6 or mx!=m)then
call SetUnitState(u,UNIT_STATE_MANA,m+0.5)
call SetUnitState(u,UNIT_STATE_LIFE,h-0.25)
call SetUnitX(d,x+100 *Cos(z))
call SetUnitY(d,y+100 *Sin(z))
call SaveReal(udg_Hash,id,2,z+.314)
set e = AddSpecialEffect(s,GetUnitX(d),GetUnitY(d))
call DestroyEffect(e)
else
call IssueImmediateOrder(u,"stop")
endif
if (OrderId2String(GetUnitCurrentOrder(u)) != "channel") then
call RemoveUnit(d)
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash,id)
else
endif
set u = null
set d = null
set t = null
set e = null
set s = null
endfunction


function Trig_Spell_Actions takes nothing returns nothing
local unit u = GetTriggerUnit()
local real z = 0
local unit d = CreateUnit(GetOwningPlayer(u),'e000',GetUnitX(u)+75.*Cos(z),GetUnitY(u)+75.*Sin(z),z*bj_RADTODEG)
local timer t = CreateTimer()
local integer id = GetHandleId(t)
call SaveUnitHandle(udg_Hash,id,0,u)
call SaveUnitHandle(udg_Hash,id,1,d)
call SaveReal(udg_Hash,id,2,z)
call TimerStart(t,0.03,true,function Trig_Spell_Actions2)
set u = null
set d = null
endfunction

//===========================================================================
function InitTrig_Spell takes nothing returns nothing
    set gg_trg_Spell = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Spell, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_Spell, Condition( function Trig_Spell_Conditions ) )
    call TriggerAddAction( gg_trg_Spell, function Trig_Spell_Actions )
endfunction
Старый 06.04.2012, 07:26
J64_

offline
Опыт: 4,724
Активность:
Используем отладочные сообщения -> находим где и когда и почему возникают проблемы.
Возможно у юнита мана всегда максимальная, также возможно что макс. мана всегда изменяется -> z никогда не изменяется
Старый 06.04.2012, 11:22
Vadik29
Choice Battle 1.6а
offline
Опыт: 15,845
Активность:
Judycaster64,оба предположения неверны, отладки не нужны т.к. триггер работает, не работает лишь if
Старый 06.04.2012, 15:26
DaeDR

offline
Опыт: 8,074
Активность:
if не может не работать!
Перед if'ом выводи на экран значения h, mx, m. Сверяй все вручную.
Не пеняй все на машину, всегда виноват человек..
Старый 06.04.2012, 17:13
Vadik29
Choice Battle 1.6а
offline
Опыт: 15,845
Активность:
DaeDR, когда у юнита целая мана триггер не отключается, также этим триггером можно убить самого себя.....
Старый 06.04.2012, 20:47
Hellfim
Новичок
offline
Опыт: 79,637
Активность:
Vadik29, замени.
set e = AddSpecialEffect(s,GetUnitX(d),GetUnitY(d))
call DestroyEffect(e)
на
call DestroyEffect(AddSpecialEffect(s,GetUnitX(d),GetUnitY(d)))
Ну и сравнивать на равенство или неравенство реальные переменные это лол. Ты понимаешь, что они могут быть представлены как 0.0599999, и 0.06, ты хочешь сравнить на равенство, а они не равны (к примеру в си, если поделить 6 на 100, то будет 0.059999, а не 0.06), так что сравнивать не рекомендую, возможно из-за этого ошибка.
Старый 06.04.2012, 21:32
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
if(h>6 or mx!=m)then
Замени на
if(h>6 and mx!=m)then
Старый 06.04.2012, 22:03
Vadik29
Choice Battle 1.6а
offline
Опыт: 15,845
Активность:
Nerevar, эти условия не должны быть одновременными
Старый 06.04.2012, 22:09
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
Ведь тебе надо чтобы здоровье было не ниже 6 и мана не была максимальной
Иначе(если какое из условий либо оба не выполняются) - останавливать
Старый 06.04.2012, 22:38
Vadik29
Choice Battle 1.6а
offline
Опыт: 15,845
Активность:
Короче если хп станет меньше 6 то остановить или если мана станет полной то остановить
Vadik29 добавил:
Hellfim, Там периодическим триггером постоянно дается мана в конечном итоге она все равно должна дойти до масимума, и когда она доходит то эффекта нету
Старый 07.04.2012, 07:06
Vadik29
Choice Battle 1.6а
offline
Опыт: 15,845
Активность:
Вот в этом триггере тоже самое, работает только первое условие....
if (OrderId2String(GetUnitCurrentOrder(u)) != "channel" or GetUnitState(c,UNIT_STATE_MAX_LIFE)<0 or GetUnitState(u,UNIT_STATE_MAX_MANA)<0.05*GetUnitState(c,UNIT_STATE_MAX_MANA))
» Код
function Trig_arcan_barrage_Conditions takes nothing returns boolean
        return GetSpellAbilityId() == 'A000'
endfunction

function SR takes real xa, real ya, real xb, real yb returns real
return SquareRoot((xa-xb)*(xa-xb)+(ya-yb)*(ya-yb))
endfunction

function Trig_arcan_barrage_Actions2 takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer id = GetHandleId(t)
    local unit u = LoadUnitHandle(udg_Hash,id,0)
    local unit d = LoadUnitHandle(udg_Hash,id,1)
    local unit d2 = LoadUnitHandle(udg_Hash,id,3)
    local unit d3 = LoadUnitHandle(udg_Hash,id,4)
    local unit c = LoadUnitHandle(udg_Hash,id,2)
    local real Angle
    local real Angle2
    local real Angle3
    local real x = GetUnitX(d)
    local real y = GetUnitY(d)
    local real x1 = GetUnitX(c)
    local real y1 = GetUnitY(c)
  if SR(x,y,x1,y1) > 26.then
    set Angle= Atan2(y-y1,x-x1)
    set Angle2=Atan2(GetUnitY(d2)-y1,GetUnitX(d2)-x1)-50
    set Angle3=Atan2(GetUnitY(d3)-y1,GetUnitX(d3)-x1)+50
    call SetUnitX(d,x-42.*Cos(Angle))
    call SetUnitY(d,y-42.*Sin(Angle))
    call SetUnitFacing(d,Angle2*bj_RADTODEG)
    call SetUnitX(d2,GetUnitX(d2)-42.*Cos(Angle2))
    call SetUnitY(d2,GetUnitY(d2)-42.*Sin(Angle2))
    call SetUnitFacing(d,Angle2*bj_RADTODEG)
    call SetUnitX(d3,GetUnitX(d3)-42.*Cos(Angle3))
    call SetUnitY(d3,GetUnitY(d3)-42.*Sin(Angle3))
    call SetUnitFacing(d,Angle3*bj_RADTODEG)
  else
    call UnitDamageTarget( u, c,GetHeroInt(u,true),false,false , ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL,WEAPON_TYPE_CLAW_LIGHT_SLICE )
    call RemoveUnit(d)
    set d = null
    set d = CreateUnit(GetOwningPlayer(u),'e000',GetUnitX(u)+25.*Cos(GetUnitFacing(u)*bj_RADTODEG),GetUnitY(u)+2​5.*Cos(GetUnitFacing(u)*bj_RADTODEG),GetUnitFacing(u))
    call RemoveUnit(d2)
    set d2 = null
    set d2 = CreateUnit(GetOwningPlayer(u),'e000',GetUnitX(u)+25.*Cos(GetUnitFacing(u)*bj_RADTODEG),GetUnitY(u)+2​5.*Cos(GetUnitFacing(u)*bj_RADTODEG),GetUnitFacing(u))
    call RemoveUnit(d3)
    set d3 = null
    set d3 = CreateUnit(GetOwningPlayer(u),'e000',GetUnitX(u)+25.*Cos(GetUnitFacing(u)*bj_RADTODEG),GetUnitY(u)+2​5.*Cos(GetUnitFacing(u)*bj_RADTODEG),GetUnitFacing(u))
    call SaveUnitHandle(udg_Hash,id,1,d)
    call SaveUnitHandle(udg_Hash,id,3,d2)
    call SaveUnitHandle(udg_Hash,id,4,d3)
    call SetUnitState(u,UNIT_STATE_MANA,GetUnitState(u,UNIT_STATE_MANA)-0.05*GetUnitState(u,UNIT_STATE_MAX_MA​NA))
  endif
if (OrderId2String(GetUnitCurrentOrder(u)) != "channel" or GetUnitState(c,UNIT_STATE_MAX_LIFE)<0 or GetUnitState(u,UNIT_STATE_MAX_MANA)<0.05*GetUnitState(c,UNIT_STATE_MAX_MANA)) then
call DestroyTimer(t)
call RemoveUnit(d)
call RemoveUnit(d2)
call RemoveUnit(d3)
call FlushChildHashtable(udg_Hash,id)
else
endif
  set u = null
  set d = null
  set d2 = null
  set d3 = null
  set c = null
  set t = null
endfunction

function Trig_arcan_barrage_Actions takes nothing returns nothing
    local unit u = GetSpellAbilityUnit()
    local unit c = GetSpellTargetUnit()
    local unit d = CreateUnit(GetOwningPlayer(u),'e000',GetUnitX(u)+25.*Cos(GetUnitFacing(u)*bj_DEGTORAD),GetUnitY(u)+2​5.*Cos(GetUnitFacing(u)*bj_DEGTORAD),GetUnitFacing(u))
    local unit d2 = CreateUnit(GetOwningPlayer(u),'e000',GetUnitX(u)+25.*Cos(GetUnitFacing(u)*bj_DEGTORAD),GetUnitY(u)+2​5.*Cos(GetUnitFacing(u)*bj_DEGTORAD),GetUnitFacing(u))
    local unit d3 = CreateUnit(GetOwningPlayer(u),'e000',GetUnitX(u)+25.*Cos(GetUnitFacing(u)*bj_DEGTORAD),GetUnitY(u)+2​5.*Cos(GetUnitFacing(u)*bj_DEGTORAD),GetUnitFacing(u))
    local timer t = CreateTimer()
    local integer id = GetHandleId(t)
    call SaveUnitHandle(udg_Hash,id,0,u)
    call SaveUnitHandle(udg_Hash,id,1,d)
    call SaveUnitHandle(udg_Hash,id,3,d2)
    call SaveUnitHandle(udg_Hash,id,4,d3)
    call SaveUnitHandle(udg_Hash,id,2,c)
    call TimerStart(t,.03,true,function Trig_arcan_barrage_Actions2)
    set u = null
    set d = null
    set d2 = null
    set d3 = null
    set c = null
endfunction

//===========================================================================
function InitTrig_arcan_barrage takes nothing returns nothing
    set gg_trg_arcan_barrage = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_arcan_barrage, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_arcan_barrage, Condition( function Trig_arcan_barrage_Conditions ) )
    call TriggerAddAction( gg_trg_arcan_barrage, function Trig_arcan_barrage_Actions )
endfunction
Vadik29 добавил:
Зато это работает -_-
if (OrderId2String(GetUnitCurrentOrder(u)) != "channel" or GetUnitLifePercent(c)==0. or GetUnitManaPercent(u)<5.) then
Старый 07.04.2012, 13:13
prog

offline
Опыт: 32,865
Активность:
GetUnitState(c,UNIT_STATE_MAX_LIFE)<0 глупость же, это максимальный запас здоровья, он не может быть <0
GetUnitState(u,UNIT_STATE_MAX_MANA)<0 аналогично
GetUnitState(u,UNIT_STATE_MAX_MANA)<0.05*GetUnitState(c,UNIT_STATE_MAX_MANA) вообще бред, всеравно что сравнивать 1<0.05*1 и удивляться почему не работает
на счет последнего прошу прощения - не заметил что для разных юнитов, но всеравно работа идет с максимальным запасом маны - естественно нифига не работает так, как тебе хочется
Старый 07.04.2012, 15:09
Vadik29
Choice Battle 1.6а
offline
Опыт: 15,845
Активность:
prog, да это фэил, просто копипастил и забыл....
Старый 07.04.2012, 16:12
Закрытая тема

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

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

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

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



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