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

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

Закрытая тема
 
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
Непонятки с боолеан в хеше
есть код
if HaveSavedValue(21, bj_HASHTABLE_BOOLEAN, h, udg_hash) then
        call DisplayTextToForce( GetPlayersAll(), "in sky - exist" )
    elseif not HaveSavedValue(21, bj_HASHTABLE_BOOLEAN, h, udg_hash) then
        call DisplayTextToForce( GetPlayersAll(), "in sky - dont exist" )
    endif
    if HaveSavedValue(22, bj_HASHTABLE_BOOLEAN, h, udg_hash) then
        call DisplayTextToForce( GetPlayersAll(), "small stun - exist" )
    elseif not HaveSavedValue(22, bj_HASHTABLE_BOOLEAN, h, udg_hash) then
        call DisplayTextToForce( GetPlayersAll(), "small stun - dont exist" )
    endif
    if HaveSavedValue(23, bj_HASHTABLE_BOOLEAN, h, udg_hash) then
        call DisplayTextToForce( GetPlayersAll(), "normal stun - exist" )
    elseif not HaveSavedValue(23, bj_HASHTABLE_BOOLEAN, h, udg_hash) then
        call DisplayTextToForce( GetPlayersAll(), "normal stun - dont exist" )
    endif
    if HaveSavedValue(24, bj_HASHTABLE_BOOLEAN, h, udg_hash) then
        call DisplayTextToForce( GetPlayersAll(), "heavy stun - exist" )
    elseif not HaveSavedValue(24, bj_HASHTABLE_BOOLEAN, h, udg_hash) then
        call DisplayTextToForce( GetPlayersAll(), "heavy stun - dont exist" )
    endif
сохраняем в хеш таблицу значения логических например под такими вариациями - false, true, false, false
	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)
после запускаем код что выше на проверку и получаем данный прикол
это как вообще обьяснить?)
Миниатюры
Кликните на картинку для увеличения
Название:  6666.JPG
Просмотров: 28
Размер:  14.9 Кбайт  
Старый 08.05.2012, 10:43
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
bj_HASHTABLE_BOOLEAN
что это такое зачем оно?
и да попробуй без него сделать
будет робит скорее всего
оно же бж, а у тя нет бж тут
Старый 08.05.2012, 11:32
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
~16GB:
bj_HASHTABLE_BOOLEAN
что это такое зачем оно?
и да попробуй без него сделать
будет робит скорее всего
оно же бж, а у тя нет бж тут
HaveSavedValue(24, bj_HASHTABLE_BOOLEAN, h, udg_hash)
эта функция проверяет есть ли логический тип данных в хэш таблице на хэндле h под ячейкой 24
Старый 08.05.2012, 19:59
Hanabishi
COOL STATUS
offline
Опыт: отключен
Что за неадекватная конструкция?
if HaveSavedValue(21, bj_HASHTABLE_BOOLEAN, h, udg_hash) then
    call DisplayTextToForce( GetPlayersAll(), "in sky - exist" )
else
    call DisplayTextToForce( GetPlayersAll(), "in sky - dont exist" )
endif
if HaveSavedValue(22, bj_HASHTABLE_BOOLEAN, h, udg_hash) then
    call DisplayTextToForce( GetPlayersAll(), "small stun - exist" )
else
    call DisplayTextToForce( GetPlayersAll(), "small stun - dont exist" )
endif
if HaveSavedValue(23, bj_HASHTABLE_BOOLEAN, h, udg_hash) then
    call DisplayTextToForce( GetPlayersAll(), "normal stun - exist" )
else
    call DisplayTextToForce( GetPlayersAll(), "normal stun - dont exist" )
endif
if HaveSavedValue(24, bj_HASHTABLE_BOOLEAN, h, udg_hash) then
    call DisplayTextToForce( GetPlayersAll(), "heavy stun - exist" )
else
    call DisplayTextToForce( GetPlayersAll(), "heavy stun - dont exist" )
endif
Hanabishi добавил:
Так стоп, это же бж. Тогда данная функция слив и не нужна.
function HaveStoredValue takes string key, integer valueType, string missionKey, gamecache cache returns boolean
    if (valueType == bj_GAMECACHE_BOOLEAN) then
        return HaveStoredBoolean(cache, missionKey, key)
    elseif (valueType == bj_GAMECACHE_INTEGER) then
        return HaveStoredInteger(cache, missionKey, key)
    elseif (valueType == bj_GAMECACHE_REAL) then
        return HaveStoredReal(cache, missionKey, key)
    elseif (valueType == bj_GAMECACHE_UNIT) then
        return HaveStoredUnit(cache, missionKey, key)
    elseif (valueType == bj_GAMECACHE_STRING) then
        return HaveStoredString(cache, missionKey, key)
    else
        // Unrecognized value type - ignore the request.
        return false
    endif
endfunction
Старый 08.05.2012, 20:54
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
дело вот то в чем! я использую логические как переключатели того какое будет оглушение, типа так
call DanteDamageMain( udg_Dante,x,y, 140., 65, 30, "123",false, true, false, false)
call DanteDamageMain( udg_Dante,x,y, 139., 70, 30, "123",true, true,false, false)
call DanteDamageMain( udg_Dante,x,y, 141., 12, 5, "123",false,false,false, false)
» собсна сама функция
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( GetPlayersAll(), "starting filtering units, prepare to calculate damage" )            
            call GroupEnumUnitsInRange(udg_TmpGroup2, x, y, Range, Filter(function FilterDamageDante))
endfunction
» и
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 = GetConvertedPlayerId(GetOwningPlayer(udg_Dante))
    local timer t
    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 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
            //-----------------------------------------------------
...
Старый 08.05.2012, 20:54
Hanabishi
COOL STATUS
offline
Опыт: отключен
Что мешает юзать HaveStoredBoolean?
Старый 08.05.2012, 20:56
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
Hanabishi:
Что мешает юзать HaveStoredBoolean?
всмысле?
у меня все конструкции неадекватны :D
Старый 08.05.2012, 20:57
Hanabishi
COOL STATUS
offline
Опыт: отключен
Всмысле вместо HaveSavedValue.
А суть проблемы непонятна.
Hanabishi добавил:
у меня все конструкции неадекватны :D
if b then
    ...
elseif not b then
    ...
endif
Как будто может быть что-то среднее между true и false =D
Старый 08.05.2012, 21:06
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
Hanabishi:
Всмысле вместо HaveSavedValue.
А суть проблемы непонятна.
Hanabishi добавил:
у меня все конструкции неадекватны :D
if b then
    ...
elseif not b then
    ...
endif
Как будто может быть что-то среднее между true и false =D
проблема в том что на этом участке кода
//-----------------------------------------------------
            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
            //-----------------------------------------------------
оглушение не делается. Ваще. Проблема оказалась в логических, и оказалось что они неведомым образом то сохраняются и извлекаются, то не сохраняются и/или не извлекаются)
перестраховался XD
Старый 08.05.2012, 21:09
Hanabishi
COOL STATUS
offline
Опыт: отключен
они неведомым образом то сохраняются и извлекаются, то не сохраняются и/или не извлекаются
И каким неведомым образом можно определить причину, не видя полного кода?
Старый 08.05.2012, 21:19
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 = GetConvertedPlayerId(GetOwningPlayer(udg_Dante))
    local timer t
    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 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
            //-----------------------------------------------------
            if StylePoints > 0 then
                if IsMultiboardDisplayed(udg_style[pId]) then
                    else
                    if GetLocalPlayer() == GetOwningPlayer(udg_Dante) then
                        call MultiboardDisplayBJ( true, udg_style[pId] )
                    endif
                endif
            set udg_StylePoints[pId] =  udg_StylePoints[pId] + StylePoints
            set t = CreateTimer()
            call TimerStart( t, 13.0, false, function TimerForStyleDante)
            endif
            //-----------------------------------------------------
        endif
    call FlushChildHashtable(udg_hash,h)
    set t = null
    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( GetPlayersAll(), "starting filtering units, prepare to calculate damage" )            
            call GroupEnumUnitsInRange(udg_TmpGroup2, x, y, Range, Filter(function FilterDamageDante))
endfunction
» функция дамми стан
//-------------------------------------------
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), 35.25, 0. , 1, false)
        call DisplayTextToForce( GetPlayersAll(), "normal stun" )
    elseif s == "thunderbolt" then
        call StaggerIni (uTarg, GetUnitFacing(uCaster), 95.25, 0. , 1, false)
        call DisplayTextToForce( GetPlayersAll(), "heavy stun" )
    endif
    call PolledWait(0.02)
    call RemoveUnit( unt )
set unt = null
endfunction
//-------------------------------------------
Старый 08.05.2012, 21:21
Hanabishi
COOL STATUS
offline
Опыт: отключен
А может всё-таки попробуешь не юзать наложение типов, чтобы не было всяких неведомых непоняток?
Или ты точно уверен, в правильности переменных ещё в функции DanteDamageMain?
Старый 08.05.2012, 21:36
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
Hanabishi:
А может всё-таки попробуешь не юзать наложение типов, чтобы не было всяких неведомых непоняток?
Или ты точно уверен, в правильности переменных ещё в функции DanteDamageMain?
я ж говорил что каждый тип данных имеет свои ячейки)
да, переменные верны.
я нашел проблему методом тыка.
как нелепо, убрал
call FlushChildHashtable(udg_hash,h)
и этот баг исчез
Старый 08.05.2012, 21:51
Hanabishi
COOL STATUS
offline
Опыт: отключен
Зато теперь таблица не очищается.
И плюс для единственного гг на карте можно делать и не через хеш, т.к. муи не нужен.
Старый 08.05.2012, 22:26
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
Hanabishi:
Зато теперь таблица не очищается.
И плюс для единственного гг на карте можно делать и не через хеш, т.к. муи не нужен.
значения не очищаются, они перезаписываются. Не вижу причин беспокойства)
Старый 08.05.2012, 22:34
Hanabishi
COOL STATUS
offline
Опыт: отключен
Hatsume_Hate, ну ок тогда.
Старый 08.05.2012, 22:37
Закрытая тема

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

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

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

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



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