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

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

Ответ
 
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
Stomp spell jass
Изучая Jass дошел до статьи с созданием стомп спела
у меня вопрос: почему ошибка, если я проверил код и он полностью соответствует статье,
равкод способности проверял но все равно не работает =\.
Может быть статья была написана давно и там устаревшие функции?
В общем в приложениях карта
InitCache и Stomp триггеры; обьясните пожалуйста в чем ошибка
Прикрепленные файлы
Тип файла: w3x sample_locs1.w3x (44.9 Кбайт, 11 просмотров )
Старый 08.01.2010, 16:34
9thNerZul
forum/warcraft3
offline
Опыт: 4,869
Активность:
Там написанно на Super Custrom Value старая системка неработающая на новом патче
Старый 08.01.2010, 20:35
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
SCV 9thNerZul, ну ок
не в все функции там стары
вот и спрашиваю что надо изменить?
Старый 08.01.2010, 20:59
XOR

offline
Опыт: 38,159
Активность:
XiMiKs добавил:
рядом 3 темы с этим вопросом...
Старый 08.01.2010, 21:01
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
эх да вижу только почитал все и полезного из этого не нашел
вопрос
Код:
function InitTrig_InitCache takes nothing returns nothing
    call FlushGameCache(InitGameCache("abilitycache.w3v"))
    set udg_AbilityCache = InitGameCache("abilitycache.w3v")
endfunction

вот код создания кеша он правильно написан на 124? или надо local hashtable ht = InitHashtable() уже?
если нет обьясните что исправить
XiMiKs, я исправил это H2I на это GetHandleId; затем это i2h на это ConvertFogState.
видимо этого не достаточно еще много ошибок компиляций
local gamecache gc = udg_AbilityCache вот вопрос геймхеш отличается от хештаблицы?
пожалуйста если кому нетрудно подробно опишите, как вы поняли первый раз то создаю хеш и мало че получается по статьям =\
темы те химикс параллельно смотрю но там оч тяжело для меня написано =\
Старый 08.01.2010, 23:59
XOR

offline
Опыт: 38,159
Активность:
Старый 09.01.2010, 00:04
avatarDr
Neophyte
offline
Опыт: 6,474
Активность:
Кеш это устаревшая фигня, вроде складика. В ней с помощью РБ можно было сохранять и загружать хендлы.
Хештаблица - новая фигня, вроде складика-таблицы. В ней с помощью нативок можно сохранять и загружать хендлы.
avatarDr добавил:
А теперь обо всём этом подробнее:
Я не знаю, что надо в этом закле делать, и карту качать лень. (Кинешь код - оценим.)
SaveZZZHandle(Hashtable,ParentKey,ChildKey,ZZZ)
Hashtable - наша хештаблица, создаваемая
globals
hashtable Ht=InitHashtable()
endglobals
ParentKey - целое число, которое будет ключевым в переноске данных из 1 триггера в другой, добываемая обычно с помощью GetHandleId(). Например, можно сохранить у цели заклинания силу кастера, сохранённую по этой цели, а потом загрузить в другом триггере.
ChildKey - тоже целое число, позволяющее для 1 ParentKey (Ну это наш юнит (Или что ещё)) сохранять много-много данных, например силу и ловкость кастера.
ZZZ - собственно само сохраняемое.
avatarDr добавил:
Кстати, вроде нет нормальных статей по хештаблицам. Есть только любимая статья ХиМиКса о неработающем РБ в 1.23+ и его любимые строки кода про "Замени H2I" и там ещё что-то.
Старый 09.01.2010, 00:14
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
ладно вижу взаимное непонимание у нас с тобой XiMiKs

вот вопрос в обучении создания стомпа создавался отдельный триггер с инициацией кеша
я и спрашиваю сейчас лучше уже делать в одном триггере(главный стомп триггер) или нет
вот идет функция очистить хеш и инициировать его:
Код:
call FlushGameCache(InitGameCache("abilitycache.w3v"))

теперь если local hashtable ht = InitHashtable() это создать гейм кеш, то какой функцией его очистить О.о?
зачем только полез изучать jass =)) только утром выучил одно и уже надо забыть и учить другое
Старый 09.01.2010, 00:15
avatarDr
Neophyte
offline
Опыт: 6,474
Активность:
native FlushParentHashtable takes hashtable table returns nothing
Либо
function FlushParentHashtableBJ takes hashtable table returns nothing
    call FlushParentHashtable(table)
endfunction
Кому что больше нравится.
теперь если local hashtable ht = InitHashtable() это создать гейм кеш
Кеша уже нет, друг. Это создание хештаблицы. Только локальная хештаблица это бред, ибо бред.
зачем только полез изучать jass =)) только утром выучил одно и уже надо забыть и учить другое
Кстати, та же проблема. Потребовалось связать атаку и получение урона, стал изучать кеш. После создания системы, идентичной рабочей, обнаружения, что она не работает, и лазания сюда узнал, что уже не актуально.
Старый 09.01.2010, 00:19
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
Цитата:
Кеша уже нет, друг.

^____^ утро прошло даром, мило

такс и как же мне научисться делал мего имбо простой стомп(по сравнению с остальными)
ну вот....
ладно буду для себя мего эстонца по отдельным вопросам
Описание для вопросов: при создании стомпа в статье сказали сделать кештриггер + сам стомп триггер
1)теперь сделать надо хештаблицу отдельным триггером как кеш или нет?
2)function InitTrig_InitHash takes nothing returns nothing
native FlushParentHashtable takes hashtable table returns nothing
set udg_AbilityCache = InitHashtable("abilitycache.w3v")
endfunction
опять я намудрил нето, вот думаю глобалка с кешом вроде или хешом(голова кругом) заменить на че?
и нужна ли первая строка если вторая есть =\
3)эх дебильный вопрос как всегда, кто умеет делать стомп скиньте пожалуйста пример для 1.24 чтобы я освоился в нем. пока jass для меня не просто туман, а буря в пустыне
Старый 09.01.2010, 00:31
avatarDr
Neophyte
offline
Опыт: 6,474
Активность:
А там был пример кода этого стомпа? Если кинешь сюда, я тебе всё преобразую с комментариями.
Старый 09.01.2010, 00:36
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
Код:
function Trig_Stomp_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A000'
endfunction

function Stomp_Filter takes nothing returns boolean
    return IsPlayerEnemy(GetOwningPlayer(GetTriggerUnit()), GetOwningPlayer(GetFilterUnit())) and GetWidgetLife(GetFilterUnit()) > 0.405 and not IsUnitType(GetFilterUnit(), UNIT_TYPE_FLYING)
endfunction

function Stomp_CopyGroup takes group g returns group
    set bj_groupAddGroupDest = CreateGroup()
    call ForGroup(g, function GroupAddGroupEnum)
    return bj_groupAddGroupDest
endfunction

function Stomp_Move takes nothing returns nothing
    local string s = I2S(H2I(GetExpiredTimer()))
    local gamecache gc = udg_AbilityCache
    local real x = GetStoredReal(gc, s, "x")
    local real y = GetStoredReal(gc, s, "y")
    local integer i = GetStoredInteger(gc, s, "level")
    local group g = Stomp_CopyGroup(I2G(GetStoredInteger(gc, s, "group")))
    local real dur = GetStoredReal(gc, s, "dur")+0.05
    local real ux
    local real uy
    local real a
    local unit f
    if dur < 1+0.5*i then
        loop
            set f = FirstOfGroup(g)
            exitwhen f == null
            set ux = GetUnitX(f)
            set uy = GetUnitY(f)
            set a = Atan2(uy-y, ux-x)
            call SetUnitPosition(f, ux+40*Cos(a), uy+40*Sin(a))
            call GroupRemoveUnit(g, f)
        endloop
        call StoreReal(gc, s, "dur", dur)
    else
        call DestroyGroup(I2G(GetStoredInteger(gc, s, "group")))
        call FlushStoredMission(gc, s)
        call DestroyTimer(GetExpiredTimer())
    endif
    set gc = null
    call DestroyGroup(g)
    set g = null
    set f = null
endfunction

function Trig_Stomp_Actions takes nothing returns nothing
    local unit c = GetTriggerUnit()
    local real x = GetUnitX(c)
    local real y = GetUnitY(c)
    local integer i = GetUnitAbilityLevel(c, 'A000')
    local boolexpr b = Condition(function Stomp_Filter)
    local group g = CreateGroup()
    local group n
    local unit f
    local gamecache gc = udg_AbilityCache
    local timer t = CreateTimer()
    local string s = I2S(H2I(t))
    call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Orc\\WarStomp\\WarStompCaster.mdl", x, y))
    call GroupEnumUnitsInRange(g, x, y, 100+50*i, b)
    set n = Stomp_CopyGroup(g)
    loop
        set f = FirstOfGroup(n)
        exitwhen f == null
        call UnitDamageTarget(c, f, 25*i, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_MAGIC, null)
        call GroupRemoveUnit(n, f)
    endloop
    call StoreInteger(gc, s, "level", i)
    call StoreInteger(gc, s, "group", H2I(g))
    call StoreReal(gc, s, "x", x)
    call StoreReal(gc, s, "y", y)
    call TimerStart(t, 0.05, true, function Stomp_Move)
    set c = null
    call DestroyBoolExpr(b)
    set b = null
    set g = null
    call DestroyGroup(n)
    set n = null
    set f = null
    set gc = null
    set t = null
endfunction

//===========================================================================
function InitTrig_Stomp takes nothing returns nothing
    set gg_trg_Stomp = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Stomp, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_Stomp, Condition( function Trig_Stomp_Conditions ) )
    call TriggerAddAction( gg_trg_Stomp, function Trig_Stomp_Actions )
    call Preload("Abilities\\Spells\\Orc\\WarStomp\\WarStompCaster.mdl")
endfunction

сам стомп триггер
Код:
function InitTrig_InitCache takes nothing returns nothing
    call FlushGameCache(InitGameCache("abilitycache.w3v"))
    set udg_AbilityCache = InitGameCache("abilitycache.w3v")
endfunction

триггеркеш к нему создаваемый до
это коды не редактированные мной другими новыми функциями
Старый 09.01.2010, 00:38
avatarDr
Neophyte
offline
Опыт: 6,474
Активность:
Да он весь погряз в кеше. Дай ещё ссылку на саму статью, если не затруднит.
avatarDr написал, чтобы не плодить постов:
В общем, завтра вечерком сделаю, спать уже пора.

Отредактировано avatarDr, 09.01.2010 в 01:19.
Старый 09.01.2010, 00:48
XOR

offline
Опыт: 38,159
Активность:
Старый 09.01.2010, 01:02
avatarDr
Neophyte
offline
Опыт: 6,474
Активность:
Вот так он выглядит в хт. Единственное, он почему-то откидывает их чуть ли не на всю карту.
» Stomp
globals
hashtable Ht=InitHashtable()
endglobals
function Trig_Stomp_Conditions takes nothing returns boolean
    return GetSpellAbilityId()=='ABIL'
endfunction
function Stomp_Filter takes nothing returns boolean
    return IsPlayerEnemy(GetOwningPlayer(GetTriggerUnit()), GetOwningPlayer(GetFilterUnit())) and GetWidgetLife(GetFilterUnit()) > 0.405 and not IsUnitType(GetFilterUnit(), UNIT_TYPE_FLYING)
endfunction
function Stomp_CopyGroup takes group g returns group
    set bj_groupAddGroupDest=CreateGroup()
    call ForGroup(g,function GroupAddGroupEnum)
    return bj_groupAddGroupDest
endfunction

function Stomp_Move takes nothing returns nothing
    local integer i=GetHandleId(GetExpiredTimer())
    local hashtable ht=Ht
    local real x=LoadReal(ht,i,2)
    local real y=LoadReal(ht,i,3)
    local integer abil=LoadInteger(ht,i,0)
    local group g=Stomp_CopyGroup(LoadGroupHandle(ht,i,1))
    local real dur=LoadReal(ht,i,4)+0.05
    local real ux
    local real uy
    local real a
    local unit f
    if dur<1+0.1*abil then
        loop
            set f = FirstOfGroup(g)
            exitwhen f == null
            set ux=GetUnitX(f)
            set uy=GetUnitY(f)
            set a=Atan2(uy-y,ux-x)
            call SetUnitPosition(f,ux+5*Cos(a),uy+5*Sin(a))
            call GroupRemoveUnit(g,f)
        endloop
    call SaveReal(ht,i,4,dur)
    else
        call DestroyGroup(LoadGroupHandle(ht,i,1))
        call FlushChildHashtable(ht,i)
        call DestroyTimer(GetExpiredTimer())
    endif
    set ht=null
    call DestroyGroup(g)
    set g=null
    set f=null
endfunction
function Trig_Stomp_Actions takes nothing returns nothing
    local unit u=GetTriggerUnit()
    local real x=GetUnitX(u)
    local real y=GetUnitY(u)
    local integer abil=GetUnitAbilityLevel(u,'ABIL')
    local boolexpr b=Condition(function Stomp_Filter)
    local group g=CreateGroup()
    local group n
    local unit f
    local hashtable ht=Ht
    local timer t=CreateTimer()
    local integer i=GetHandleId(t)
    call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Orc\\WarStomp\\WarStompCaster.mdl", x, y))
    call GroupEnumUnitsInRange(g,x,y,100+50*abil,b)
    set n=Stomp_CopyGroup(g)
    loop
        set f=FirstOfGroup(n)
        exitwhen f == null
        call UnitDamageTarget(u,f,25*abil,true,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_MAGIC,null)
        call GroupRemoveUnit(n, f)
    endloop
    call SaveInteger(ht,i,0,abil)
    call SaveGroupHandle(ht,i,1,g)
    call SaveReal(ht,i,2,x)
    call SaveReal(ht,i,3,y)
    call TimerStart(t,0.05,true,function Stomp_Move)
    set u=null
    call DestroyBoolExpr(b)
    set b=null
    set g=null
    call DestroyGroup(n)
    set n=null
    set f=null
    set ht=null
    set t=null
endfunction
function InitTrig_Stomp takes nothing returns nothing
    set gg_trg_Stomp=CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ(gg_trg_Stomp,EVENT_PLAYER_UNIT_SPELL_EFFECT)
    call TriggerAddCondition(gg_trg_Stomp,Condition( function Trig_Stomp_Conditions))
    call TriggerAddAction(gg_trg_Stomp,function Trig_Stomp_Actions)
    call Preload("Abilities\\Spells\\Orc\\WarStomp\\WarStompCaster.mdl")
endfunction
Сравнивай с оригиналом, заменены там в основном функции Store и GetStored на Save и Load.
Хотя отбрасывание связано с установленными автором характеристиками.
Ещё почему-то группа юнитов неправильно обрабатывается. Он на всех юнитов на карте действует.

Отредактировано avatarDr, 09.01.2010 в 15:04.
Старый 09.01.2010, 13:26
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
большое спасибо щас начну смотреть что изменилось
значит теперь в 1 триггер?
и еще вопрос можно ли делать в 1 триггере много спелов, ну подтриггеры чтоль?

Отредактировано AlexKARASb, 09.01.2010 в 14:12.
Старый 09.01.2010, 14:06
avatarDr
Neophyte
offline
Опыт: 6,474
Активность:
Нашёл. Замени у себя
В function Trig_Stomp_Actions takes nothing returns nothing
//call GroupEnumUnitsInRange(g, x, y, 100+50*i, b)
call GroupEnumUnitsInRange(g,x,y,100+50*abil,b)
И в function Stomp_Move takes nothing returns nothing замени
//if dur<1+0.5*abil then
if dur<1+0.1*abil then
//call SetUnitPosition(f,ux+40*Cos(a),uy+40*Sin(a))
call SetUnitPosition(f,ux+5*Cos(a),uy+5*Sin(a))
Старый 09.01.2010, 14:12
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
незнаю почему но ошибок компиляций штук 100 =\
Старый 09.01.2010, 14:55
avatarDr
Neophyte
offline
Опыт: 6,474
Активность:
Компилятором или при сохранении карты?
Старый 09.01.2010, 15:01
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
просто когда нажал включить триггер написал много ошибок
Старый 09.01.2010, 15:02
Ответ

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

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

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

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



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