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

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

Ответ
 
ZLOBICH
Kicked by XimikS
offline
Опыт: 4,727
Активность:
Запись в кэш
Код:
function SummonC takes nothing returns boolean
return GetSpellAbilityId()==0x41373737
endfunction
function SummonB takes nothing returns nothing
local integer i=GetUnitAbilityLevel(GetTriggerUnit(),'A002')
local integer d=GetSpellAbilityId()
local unit u=i2u(GetStoredInteger(udg_cache,"Summons",I2S(GetPlayerId(GetTriggerPlayer()))))
call BJDebugMsg(GetUnitName(u))
if u!=null then
call KillUnit(u)
call ReviveHero(u,GetUnitX(GetTriggerUnit())+0x1a,GetUnitY(GetTriggerUnit())+0x1a,fal  se)
call StoreInteger(udg_cache,"Summons",I2S(GetPlayerId(GetTriggerPlayer())),h2i(u))
call BJDebugMsg(GetUnitName(i2u(h2i(u))))
else
set u=CreateUnit(GetTriggerPlayer(),d+0x7000000,GetUnitX(GetTriggerUnit())+0x0a,GetU  nitY(GetTriggerUnit())+0x0a,0x00)
call StoreInteger(udg_cache,"Summons",I2S(GetPlayerId(GetTriggerPlayer())),h2i(u))
call BJDebugMsg(GetUnitName(i2u(h2i(u))))
endif
if i>1 then
call SetHeroLevel(u,i,false)
endif
if i>=3 then
call UnitAddAbility(u,'ACct')
endif
if i>=5 then
call UnitAddAbility(u,'ACev')
endif
if i>=7 then
call UnitAddAbility(u,'ACbh')
endif
if i==10 then
call UnitAddAbility(u,'Acht')
endif
set u=null
endfunction
function InitTrig_Beastmaster_summons takes nothing returns nothing
local trigger tr=CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(tr,EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(tr,Condition(function SummonC))
call TriggerAddAction(tr,function SummonB)
endfunction

Собственно, как-то криво пишется в кэш.. первая дебаг сообщение выводит ВСЕГДА null, НО! вторая дебаг, выводящие имя записанного юнита выводит ВСЕГДА правильно. Уверен на 100% я опять где-то допустил ужасно тупую ошибку но не могу найти -_-
//add
добавил call BJDebugMsg(GetUnitName(i2u(GetStoredInteger(udg_cache,"Summons",I2S(GetPlayerId(GetTriggerPlayer())))))) сразу посли записи в кэш, также выводит null..

Отредактировано ZLOBICH, 26.03.2008 в 16:01.
Старый 26.03.2008, 15:52
J
expert
offline
Опыт: 48,447
Активность:
попробуй так, если получится скажу в чем была ошибка:
Код:
function SummonC takes nothing returns boolean
    return GetSpellAbilityId()==0x41373737
endfunction

function SummonB takes nothing returns nothing  
    local unit    Caster = GetSpellAbilityUnit() 
    local integer i      = GetUnitAbilityLevel(Caster, 'A002')
    local integer d      = GetSpellAbilityId()
    local player  P = GetOwningPlayer(Caster)
    local unit    u = i2u(GetStoredInteger(udg_cache, "Summons", I2S(GetPlayerId(p)))
    call BJDebugMsg(GetUnitName(u))
    if u != null then 
        call BJDebugMsg(GetUnitName(i2u(h2i(u))))
        call KillUnit(u)
        call ReviveHero(u, GetUnitX(Caster)+26, GetUnitY(Caster)+26, false)
    else
        set u = CreateUnit(p, d+0x7000000, GetUnitX(Caster)+10, GetUnitY(Caster)+10, 0)
        call StoreInteger(udg_cache, "Summons", I2S(GetPlayerId(p)), h2i(u))
        call BJDebugMsg(GetUnitName(i2u(h2i(u))))
    endif
    if i > 1 then
        call SetHeroLevel(u, i, false)
    endif
    if i >= 3 then
        call UnitAddAbility(u, 'ACct')
    endif
    if i >= 5 then
        call UnitAddAbility(u, 'ACev')
    endif
    if i >= 7 then
        call UnitAddAbility(u, 'ACbh')
    endif
    if i == 10 then
        call UnitAddAbility(u, 'Acht')
    endif
    set u = null
endfunction

function InitTrig_Beastmaster_summons takes nothing returns nothing
    local trigger tr = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ(tr,EVENT_PLAYER_UNIT_SPELL_EFFECT)
    call TriggerAddCondition(tr,Condition(function SummonC))
    call TriggerAddAction   (tr,          function SummonB)  
    set tr = null
endfunction

Отредактировано Jon, 26.03.2008 в 18:06.
Старый 26.03.2008, 17:43
ZLOBICH
Kicked by XimikS
offline
Опыт: 4,727
Активность:
также null, только теперь в добавок лвл не сеттиться)
Старый 26.03.2008, 17:54
J
expert
offline
Опыт: 48,447
Активность:
Подправил, попробуй еще раз
Старый 26.03.2008, 18:06
ZLOBICH
Kicked by XimikS
offline
Опыт: 4,727
Активность:
лвл сеттиться, нулл остаётся:)
Старый 26.03.2008, 18:17
J
expert
offline
Опыт: 48,447
Активность:
кстате, замени
Код:
if u != null then 
        call BJDebugMsg(GetUnitName(i2u(h2i(u))))
        call KillUnit(u)
        call ReviveHero(u, GetUnitX(Caster)+26, GetUnitY(Caster)+26, false)
    else
        set u = CreateUnit(p, d+0x7000000, GetUnitX(Caster)+10, GetUnitY(Caster)+10, 0)
        call StoreInteger(udg_cache, "Summons", I2S(GetPlayerId(p)), h2i(u))
        call BJDebugMsg(GetUnitName(i2u(h2i(u))))
    endif
на
Код:
if u != null then 
        call KillUnit(u)
    endif
    set u = CreateUnit(p, d+0x7000000, GetUnitX(Caster)+10, GetUnitY(Caster)+10, 0)
    call StoreInteger(udg_cache, "Summons", I2S(GetPlayerId(p)), h2i(u))

а насчет ошибки проверь d+0x7000000 он точно такой какой нужен?
Старый 26.03.2008, 18:23
adic3x

offline
Опыт: 108,439
Активность:
очень странное муи
в таком случае кешь вообще не нужен, т.е. тебе думаю легче сделать массив с индексацией по номеру игрока

ADOLF добавил:
а! да кста я об этом писал... т.е. в кешь нельзя стоирть обьекты которые могут быть удалены иначе это опасно багами что на выходе через i2h мы вообще рискуем получить не то что надо! т.е. если юнит убит и на него нет ссылок под данным хендлом может быть создан новый! это ТТ
Старый 26.03.2008, 19:28
J
expert
offline
Опыт: 48,447
Активность:
Цитата:
а! да кста я об этом писал... т.е. в кешь нельзя стоирть обьекты которые могут быть удалены иначе это опасно багами что на выходе через i2h мы вообще рискуем получить не то что надо! т.е. если юнит убит и на него нет ссылок под данным хендлом может быть создан новый! это ТТ
это не проблема если следить за этим...

хотя то что сдесь не нужен кеш поддерживаю

Jon добавил:
ZLOBICH я понимаю если бы ты делал чтобы этот спел работал для каждого юнита, тогда там кое какой замут нужен был, а ты делаеш чтобы его мог юзать только один юнит от каждого игрока, сдесь можно обойтись всего однои масивом
Старый 26.03.2008, 19:48
ZLOBICH
Kicked by XimikS
offline
Опыт: 4,727
Активность:
Jon у меня юнит герой, если делать так то слева на панели интерфейса через 7 вызовов будет 7 иконок мёртвого медведа, это ТТ
про кэш что-то \ ступил, на самом деле легче сделать через массив.. ну а просто, дл\ справки, никто не знает почему не сториться?
/edit
чтож, массив спас положение, но всёже интересно что с кэшем? Ааааа озарение ударило меня тяжёлым молотком))) я забыл инициализировать кэш, ТТ, сри

Отредактировано ZLOBICH, 26.03.2008 в 22:57.
Старый 26.03.2008, 22:11
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
иконки медведам можно вообще убирать с панели нафиг, делается это в РО + есть на это ремув..
Старый 27.03.2008, 06:09
ZLOBICH
Kicked by XimikS
offline
Опыт: 4,727
Активность:
да нет мне будет удобнее как раз чтоб иконка медведа была)
ремув же вроде не убирает "до конца" героев, т.е. их всё ещё можно возродить в алтаре?(или после 7 ремувов героя для одного игрока какая-то херь происходит.. забыл))
Старый 27.03.2008, 14:12
adic3x

offline
Опыт: 108,439
Активность:
кил убивает
ремув удаляет
Старый 27.03.2008, 14:24
ZLOBICH
Kicked by XimikS
offline
Опыт: 4,727
Активность:
сейчас провёл тесты - ремувя героя и затем создавая нового к имени героя начнут привязываться римские цифры => всё таки не до конца ремувится))
ладно тему клоз, а то я сейчас расфлужусь тут -_-
Старый 27.03.2008, 15:54
Ответ

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

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

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

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



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