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

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

Закрытая тема
 
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
Теряется интежер
хм, проблема заключается в вот чем.
функция принимает интежер (в данном тесте это значение 31)
function DanteDamageMain takes ... integer StylePoints ...
сохраняет его в хеш
call SaveInteger(udg_hash,h,22,StylePoints)
call DisplayTextToForce( bj_FORCE_ALL_PLAYERS, I2S(StylePoints)+" must added style points" )
другая загружает и прибавляет
local integer StylePoints = LoadInteger(udg_hash,h,22)
...
call DisplayTextToForce( bj_FORCE_ALL_PLAYERS, I2S(StylePoints)+" added style points" )
if StylePoints > 0 then
                if IsMultiboardDisplayed(udg_style[pId]) then
                    else
                    if GetLocalPlayer() == GetOwningPlayer(udg_Dante) then
                        call MultiboardDisplay(udg_style[pId], true)
                    endif
                endif
            set udg_StylePoints[pId] =  udg_StylePoints[pId] + StylePoints
            call DisplayTextToForce( bj_FORCE_ALL_PLAYERS, I2S(udg_StylePoints[pId])+" style points" )
call TimerStart( DST, 13.0, false, function TimerForStyleDante)
endif
...
однако фишка в том что значение прибавляется не всегда, а только в определенных вызовах, например 4 удара, на первом не прибавится, на втором нет, на третьем да, на четвертом опять нет. И так каждый раз. Вызываю одинаково, никаких различий, однако прибавляется по непонятно какой логике.
скрин вот, красным отмечено срабатывание.
Миниатюры
Кликните на картинку для увеличения
Название:  wtf.JPG
Просмотров: 32
Размер:  16.0 Кбайт  
Старый 20.05.2012, 20:07
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
function DanteDamageMain
на какое событие срабатывает?
Старый 20.05.2012, 20:23
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
~16GB:
function DanteDamageMain
на какое событие срабатывает?
никакое, оно вызывается когда нужно, висит в шапке
Старый 20.05.2012, 20:30
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
ну ты его когда то вызываешь, вот перед вызовом тоже раздебаж всё, раз тут всё в порядке
Старый 20.05.2012, 20:44
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
и что я раздебажу? запускаю таймер и по истечению вызываю
call DanteDamageMain( udg_Dante,x,y, 140., 35, 31, "123",false, true, false, false)
это кастер, вектор, радиус, урон, очки стиля, etc, цель в воздух, малое оглушение, среднее оглушение, сильное оглушение.
Старый 20.05.2012, 20:55
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
Ну значит больше кода показывай
Старый 20.05.2012, 21:02
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
» весь
function FilterDamageDante takes nothing returns boolean
    local unit u = GetFilterUnit()
    local integer h = GetHandleId(udg_Dante)
    local integer Dmg = LoadInteger(udg_hash,h,21)
    local integer StylePoints = LoadInteger(udg_hash,h,22)
    local integer pId = GetPlayerId(GetOwningPlayer(udg_Dante))+1
    local boolean InSky = LoadBoolean(udg_hash, h, 21)
    local boolean SmallStun = LoadBoolean(udg_hash, h, 22)
    local boolean NormalStun = LoadBoolean(udg_hash, h, 23)
    local boolean HeavyStun = LoadBoolean(udg_hash, h, 24)
    local string s
    local unit sparks
        if (IsUnitEnemy(u, GetOwningPlayer(udg_Dante)) and not IsUnitType(u,UNIT_TYPE_DEAD)) and GetUnitFlyHeight(u) <= 10 and u != udg_Dante then
           call UnitDamageTarget(udg_Dante, u, I2R(Dmg), true, false, ATTACK_TYPE_NORMAL ,  DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
            call PlaySnd(udg_Dante, u)
            //call DisplayTextToForce( GetPlayersAll(), GetUnitName(u) + " is a damaged by Dante!" )
            //-----------------------------------------------------
            set sparks = CreateUnit(Player(PLAYER_NEUTRAL_PASSIVE), 'h00X', GetUnitX(u)+GetRandomReal(1.,3.), GetUnitY(u)+GetRandomReal(1.,3.), GetRandomReal(0.00, 360.00))
            call SetUnitAnimation(sparks, "stand")
            call SetUnitFlyHeight( sparks, GetRandomReal(90., 130.), 100000000.00)
            call AddBlood(u, GetUnitX(u), GetUnitY(u),1, 0.1)
            //-----------------------------------------------------
            if InSky then
                call GroupAddUnit(udg_TmpGroup, u)
                call SaveReal(udg_hash, GetHandleId(u), 0, 275.)
                call SaveReal(udg_hash, GetHandleId(u), 1, 0.)
                call EnableTrigger( gg_trg_Jump_Tick)
            endif
            //-----------------------------------------------------
            if SmallStun then
                set s = "firebolt"
            elseif NormalStun then
                set s = "firebolt"
            elseif HeavyStun then
                set s = "thunderbolt"
            elseif not SmallStun and not NormalStun and not HeavyStun then
                call StaggerIni (u, GetUnitFacing(udg_Dante), 2.25, 0. , 1, false)
            endif
            //call DisplayTextToForce( GetPlayersAll(), "stun is " +s )
            if SmallStun or NormalStun or HeavyStun then
                call DummyStun(u,udg_Dante, s)
            endif
            //-----------------------------------------------------
            call DisplayTextToForce( bj_FORCE_ALL_PLAYERS, I2S(StylePoints)+" added style points" )
            if StylePoints > 0 then
                if IsMultiboardDisplayed(udg_style[pId]) then
                    else
                    if GetLocalPlayer() == GetOwningPlayer(udg_Dante) then
                        call MultiboardDisplay(udg_style[pId], true)
                    endif
                endif
            set udg_StylePoints[pId] =  udg_StylePoints[pId] + StylePoints
            call DisplayTextToForce( bj_FORCE_ALL_PLAYERS, I2S(udg_StylePoints[pId])+" style points" )
            call TimerStart( DST, 13.0, false, function TimerForStyleDante)
            endif
            //-----------------------------------------------------
        endif
    //call FlushChildHashtable(udg_hash,h)
    set u = null
    set sparks = null
    return false
endfunction

function DanteDamageMain takes unit uCaster, real x, real y, real Range, integer Dmg, integer StylePoints, string s, boolean InSky, boolean SmallStun, boolean NormalStun, boolean HeavyStun returns nothing
            local integer h = GetHandleId (udg_Dante)
            call SaveInteger(udg_hash,h,21,Dmg)
            call SaveInteger(udg_hash,h,22,StylePoints)
            call SaveBoolean(udg_hash,h,21,InSky)
            call SaveBoolean(udg_hash,h,22,SmallStun)
            call SaveBoolean(udg_hash,h,23,NormalStun)
            call SaveBoolean(udg_hash,h,24,HeavyStun)
//-----------------------------------------------------
            call DisplayTextToForce( bj_FORCE_ALL_PLAYERS, I2S(StylePoints)+" must added style points" )
            //call DisplayTextToForce( GetPlayersAll(), "starting filtering units, prepare to calculate damage" )            
            call GroupEnumUnitsInRange(udg_TmpGroup2, x, y, Range, Filter(function FilterDamageDante))
endfunction
Старый 20.05.2012, 21:04
prog

offline
Опыт: 32,865
Активность:
            call SaveInteger(udg_hash,h,21,Dmg)
            call SaveInteger(udg_hash,h,22,StylePoints)
            call SaveBoolean(udg_hash,h,21,InSky)
            call SaveBoolean(udg_hash,h,22,SmallStun)
Не хорошо как-то по одному ключу записывать разные значения, не находишь?
Старый 21.05.2012, 11:06
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
prog:
            call SaveInteger(udg_hash,h,21,Dmg)
            call SaveInteger(udg_hash,h,22,StylePoints)
            call SaveBoolean(udg_hash,h,21,InSky)
            call SaveBoolean(udg_hash,h,22,SmallStun)
Не хорошо как-то по одному ключу записывать разные значения, не находишь?
Nerevar,
Ты сохраняешь в одну и ту же ячейку с индексом 1 - и юнита и реальную=/
Hanabishi,
так можно.
Nerevar,
Так то можно,но будет в ней к моменту выгружения храниться реальное ведь
Hanabishi
Nerevar, как ни странно, будут обе переменные хранится, для каждого типа своя. Это мне самому доказал недавно один товарищ.
(и этим товарищем был я)
каждый тип данных использует свои ячейки
Старый 21.05.2012, 11:10
prog

offline
Опыт: 32,865
Активность:
окей, что-то значит изменилось или меня клинит - делал такой-же пример и значение затиралось
тогда добавляй больше дебага - определяй не рвется ли где-то поток выполнения и не чистит ли кто-то эту группу udg_TmpGroup2 во время работы фильтра
Старый 21.05.2012, 11:39
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
prog:
окей, что-то значит изменилось или меня клинит - делал такой-же пример и значение затиралось
тогда добавляй больше дебага - определяй не рвется ли где-то поток выполнения и не чистит ли кто-то эту группу udg_TmpGroup2 во время работы фильтра
смотри внимательнее, в группу никто не заносится
хм, проверю не рвется ли поток
Hatsume_Hate добавил:
поток грохается после этого
 call DisplayTextToForce( bj_FORCE_ALL_PLAYERS,"stage 4 - stun" )
            if SmallStun then
                set s = "firebolt"
            elseif NormalStun then
                set s = "firebolt"
            elseif HeavyStun then
                set s = "thunderbolt"
            elseif not SmallStun and not NormalStun and not HeavyStun then
                call StaggerIni (u, GetUnitFacing(udg_Dante), 2.25, 0. , 1, false)
            endif
            //call DisplayTextToForce( GetPlayersAll(), "stun is " +s )
            if SmallStun or NormalStun or HeavyStun then
                call DummyStun(u,udg_Dante, s)
            endif
Старый 21.05.2012, 11:45
adic3x

offline
Опыт: 108,439
Активность:
Читайте эту тему в часности "Запись в хеш".
Старый 21.05.2012, 11:52
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
ADOLF:
Читайте эту тему в часности "Запись в хеш".
ну и?) какая разница, буду я создавать константу или просто напишу 1.
Старый 21.05.2012, 12:04
prog

offline
Опыт: 32,865
Активность:
call DisplayTextToForce( bj_FORCE_ALL_PLAYERS,"stage 4 - stun" )
т.е. это выводится?
а где следующий дебаг находится, который уже не выводится?
Старый 21.05.2012, 12:17
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
это интересно.
поменял немного местами куски кода
/--------------------=========================---------------------
function FilterDamageDante takes nothing returns boolean
    local unit u = GetFilterUnit()
    local integer h = GetHandleId(udg_Dante)
    local integer Dmg = LoadInteger(udg_hash,h,21)
    local integer StylePoints = LoadInteger(udg_hash,h,22)
    local integer pId = GetPlayerId(GetOwningPlayer(udg_Dante))+1
    local boolean InSky = LoadBoolean(udg_hash, h, 21)
    local boolean SmallStun = LoadBoolean(udg_hash, h, 22)
    local boolean NormalStun = LoadBoolean(udg_hash, h, 23)
    local boolean HeavyStun = LoadBoolean(udg_hash, h, 24)
    local string s
    local unit sparks
    call DisplayTextToForce( bj_FORCE_ALL_PLAYERS,"start filter" )
        if (IsUnitEnemy(u, GetOwningPlayer(udg_Dante)) and not IsUnitType(u,UNIT_TYPE_DEAD)) and GetUnitFlyHeight(u) <= 10 and u != udg_Dante then
           call DisplayTextToForce( bj_FORCE_ALL_PLAYERS,"stage 1 - damage" )
           call UnitDamageTarget(udg_Dante, u, I2R(Dmg), true, false, ATTACK_TYPE_NORMAL ,  DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
            call PlaySnd(udg_Dante, u)
            //call DisplayTextToForce( GetPlayersAll(), GetUnitName(u) + " is a damaged by Dante!" )
            //-----------------------------------------------------
            call DisplayTextToForce( bj_FORCE_ALL_PLAYERS,"stage 2 - effects" )
            set sparks = CreateUnit(Player(PLAYER_NEUTRAL_PASSIVE), 'h00X', GetUnitX(u)+GetRandomReal(1.,3.), GetUnitY(u)+GetRandomReal(1.,3.), GetRandomReal(0.00, 360.00))
            call SetUnitAnimation(sparks, "stand")
            call SetUnitFlyHeight( sparks, GetRandomReal(90., 130.), 100000000.00)
            call AddBlood(u, GetUnitX(u), GetUnitY(u),1, 0.1)
            //-----------------------------------------------------
            call DisplayTextToForce( bj_FORCE_ALL_PLAYERS,"stage 3 - style points" )
            call DisplayTextToForce( bj_FORCE_ALL_PLAYERS, I2S(StylePoints)+" added style points" )
            if StylePoints > 0 then
                if not IsMultiboardDisplayed(udg_style[pId]) then
                    if GetLocalPlayer() == GetOwningPlayer(udg_Dante) then
                        call MultiboardDisplay(udg_style[pId], true)
                    endif
                endif
                set udg_StylePoints[pId] =  udg_StylePoints[pId] + StylePoints
                call DisplayTextToForce( bj_FORCE_ALL_PLAYERS, I2S(udg_StylePoints[pId])+" style points" )
            call TimerStart( DST, 13.0, false, function TimerForStyleDante)
            endif
            //-----------------------------------------------------
            call DisplayTextToForce( bj_FORCE_ALL_PLAYERS,"stage 4 - in air?" )
            if InSky then
                call GroupAddUnit(udg_TmpGroup, u)
                call SaveReal(udg_hash, GetHandleId(u), 0, 275.)
                call SaveReal(udg_hash, GetHandleId(u), 1, 0.)
                call EnableTrigger( gg_trg_Jump_Tick)
            endif
            //-----------------------------------------------------
            call DisplayTextToForce( bj_FORCE_ALL_PLAYERS,"stage 5 - stun" )
            if SmallStun then
                set s = "firebolt"
                call DummyStun(u,udg_Dante, s)
                call DisplayTextToForce( bj_FORCE_ALL_PLAYERS," light stun" )
            elseif NormalStun then
                set s = "firebolt"
                call DummyStun(u,udg_Dante, s)
                call DisplayTextToForce( bj_FORCE_ALL_PLAYERS," midlle stun" )
            elseif HeavyStun then
                set s = "thunderbolt"
                call DummyStun(u,udg_Dante, s)
                call DisplayTextToForce( bj_FORCE_ALL_PLAYERS," heavy stun" )
            elseif not SmallStun and not NormalStun and not HeavyStun then
                call StaggerIni (u, GetUnitFacing(udg_Dante), 2.25, 0. , 1, false)
            endif
            call DisplayTextToForce( GetPlayersAll(), "stun is " +s )
        endif
    call DisplayTextToForce( bj_FORCE_ALL_PLAYERS,"end filter" )
    //call FlushChildHashtable(udg_hash,h)
    set u = null
    set sparks = null
    return false
endfunction
дальше call DisplayTextToForce( bj_FORCE_ALL_PLAYERS,"stage 5 - stun" )ничего не выводится , очки прибавляются, хм...
и оглушение кидается, собственно текста нету, но функция call DummyStun(u,udg_Dante, s) запускается
Старый 21.05.2012, 12:22
prog

offline
Опыт: 32,865
Активность:
теперь дебажить DummyStun надо - видать ты там что-то юзаешь, запрещенное в фильтрах или просто рвущее поток
Старый 21.05.2012, 12:55
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
function DummyStun takes unit uTarg, unit uCaster, string s returns nothing
    local unit unt = CreateUnit( Player(PLAYER_NEUTRAL_PASSIVE), 'u001', GetUnitX(uCaster), GetUnitY(uCaster), bj_UNIT_FACING )
    call IssueTargetOrder( unt, s, uTarg )
    call PauseUnit(uTarg, false )
    if s == "firebolt" then
        call StaggerIni (uTarg, GetUnitFacing(uCaster), 19., 0. , 1, false)
        //call DisplayTextToForce( GetPlayersAll(), "normal stun" )
    elseif s == "thunderbolt" then
        call StaggerIni (uTarg, GetUnitFacing(uCaster), 65.25, 0. , 1, false)
        //call DisplayTextToForce( GetPlayersAll(), "heavy stun" )
    endif
    call TriggerSleepAction (0.02)
    call RemoveUnit( unt )
set unt = null
endfunction
и чтож тут такого страшного
Старый 21.05.2012, 13:04
Master_chan
Полуночный командир
offline
Опыт: 15,660
Активность:
Вообще вот это:
call TriggerSleepAction (0.02)
Старый 21.05.2012, 13:15
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
Master_chan:
Вообще вот это:
call TriggerSleepAction (0.02)
эта унылая функция еще и рвет поток? >.<
Старый 21.05.2012, 13:16
Master_chan
Полуночный командир
offline
Опыт: 15,660
Активность:
Именно так.
Задавай время жизни дамми-юнитов в пределах 1 секунды, этого хватает для дамми-каста.
Старый 21.05.2012, 13:17
Закрытая тема

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

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

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

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



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