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

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

Закрытая тема
 
FatalBlade

offline
Опыт: 7,398
Активность:
EnableTrigger(...) - через хэш - Не работает включение сохранённого триггера
Я решил сделать такую тему: отключить все триггеры для спеллов, и сохранить их в равкоды выбираемых способностей (система выбора спеллов). Когда выбирается какой то спелл, все триггеры для данного спелла активируются. Но почему то триггеры не активируются когда я загружаю их из хэша. Сами триггеры то активируются, когда сразу пишешь EnableTrigger( gg_trg_Trigger ), а вот когда я пишу EnableTrigger( LoadTriggerHandle(udg_Hash, id, key) ) - не работает. Почему?
Старый 02.04.2012, 01:02
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,259
Активность:
FatalBlade, ошибка у тебя с хешем где то, выведи на экран Хендл триггера, и если будет 0 то явно что ты в хеш нечего не сохранил...
call DisplayeTextToPlayer(Player(0),0,0,I2S(GetHandleId(LoadTriggerHandle(udg_Hash, id, key) )))
Старый 02.04.2012, 03:10
FatalBlade

offline
Опыт: 7,398
Активность:
Хэш инициализированный и с ним проблем нету, потому что он является базой данных для системы выбора спеллов. А система выбора спелов же работает :) Вот тут сохраняется.
    call SaveAgentHandle(udg_Abilities, 'A0KZ', 101, gg_trg_Leap)
Равкод 'A0KZ' - пустышка с иконкой и описанием скилла "Прыжок".
Затем, при выборе спеллов, а это дамми с пустышками, выбирается 3 скилла из 9-ти. В начале вычисляется равкод самой абилки. Например мы нажали на Leap, то есть на 'A0KZ'.
    local integer i = GetSpellAbilityId()
Сохранили равкод.
    call EnableTrigger( LoadTriggerHandle(udg_Abilities,i,101) )
А вот и загружаем триггер. Всё правильно же с указателями, но триггер не активируется(
Старый 02.04.2012, 09:50
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,259
Активность:
FatalBlade, ты проверил?
Я тебе писал пример, что на экране показывает?
весь код покажи, мб ты хеш без задержки инициализировал, а мб у тебя Disable trigger стоит...

Отредактировано quq_CCCP, 02.04.2012 в 10:09.
Старый 02.04.2012, 10:00
DioD

offline
Опыт: 45,134
Активность:
отладочные сообщения как сказано выше, почему хотя бы не попробовать вывести текст при до или после линий, может быть у тебя условия косячные и функция никогда не срабатывает.
Старый 02.04.2012, 14:17
FatalBlade

offline
Опыт: 7,398
Активность:
quq_CCCP:
ошибка у тебя с хешем где то, выведи на экран Хендл триггера, и если будет 0 то явно что ты в хеш нечего не сохранил...
quq_CCCP:
весь код покажи, мб ты хеш без задержки инициализировал, а мб у тебя Disable trigger стоит...
DioD:
отладочные сообщения как сказано выше, почему хотя бы не попробовать вывести текст при до или после линий, может быть у тебя условия косячные и функция никогда не срабатывает.
DisableTrigger точно нету, я проверял.)
С текстом попробую, щас просто не с компа сижу. Но вот насчёт неправильности хэша, этого быть не может. Дело в том что на этом хэше построенна база данных для многих равкодов, скиллов, предметов. Сохраняются там не только равкоды, т.е. Интежеры, но и реальные числа, и строки. И никаких проблем никогда небыло и нету с этими данными. Только вот с этими триггерами. Кроме них не сохраняется никаких хэндлов в этот хэш. Но какие проблемы могут быть в сохранение хэндлов?
Условий в данном случае вообще нету. Идёт простая загрузка хэндла(триггера) из хэша. LoadTriggerHandle
З.Ы. Хэш инициализируется после задержки, не сразу после инита. Задержка = 7.5 секунд
.~ScorpioT1000:
гораздо проще поплакать в академии, инфа 100% поможет
Не умею плакать(
Да и что за академия? Тут довольно таки сложная проблема, которую не каждый решит. )
Вопрос тогда вот в чём. Если я вырублю все триггеры которые реагируют на спеллы, и буду включать только те триггеры, которые имеют отношения выбранному герою/скиллу. Это хорошо поднимет производительность, при ~60-70 таких триггерах?
Старый 05.04.2012, 00:29
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,259
Активность:
Вопрос тогда вот в чём. Если я вырублю все триггеры которые реагируют на спеллы, и буду включать только те триггеры, которые имеют отношения выбранному герою/скиллу. Это хорошо поднимет производительность, при ~60-70 таких триггерах?
ну это сомнительно, ты вряд ли заметиш прирост производительности, это раз, два триггеры некуда не делись из память компьютера. их события и действия тоже. то что триггер не запускается, не говорит от том что память занимаемая им освобождена.
Кстати ты читал статьи про оптимизацию, что триггер можно для 10 спелов и 1 сделать, только грамотно событие и условие поставит...
Старый 05.04.2012, 03:13
FatalBlade

offline
Опыт: 7,398
Активность:
quq_CCCP:
ну это сомнительно, ты вряд ли заметиш прирост производительности, это раз, два триггеры некуда не делись из память компьютера. их события и действия тоже. то что триггер не запускается, не говорит от том что память занимаемая им освобождена.
При касте спелла будет запускаться 1 условие, а не 100500. Это не даст прирост в производительности?
quq_CCCP:
Кстати ты читал статьи про оптимизацию, что триггер можно для 10 спелов и 1 сделать, только грамотно событие и условие поставит...
Можно сделать 1 триггер и для 999999999999 спеллов. Не надо даже никакие статьи читать. И это будет лучше чем 999999999999 триггеров. Однако мне, да и любому автору будет в 999999999999 сложнее разбираться в коде этого мега-триггера.
Старый 05.04.2012, 19:37
J64_

offline
Опыт: 4,724
Активность:
FatalBlade, тогда забудь про WE
а лучше сделай перебор всех Id способностей.
if(id == 'A000')then
	call A000_Func()
elseif(id == 'A001')then
	call A001_Func()
else
...
endif
а когда более менее станешь шарить, то можно сделать бинарное дерево
if(id < 'A002')then
	if(id < 'A001')then
		call A000_Func()
	else
		call A001_Func()
	endif
else
	if(id < 'A003')then
		call A002_Func()
	else
		call A003_Func()
	endif
endif
такая схема всегда будет выполняться за log(N) проверок, в отличии от первой, у которого, количество операций колеблется от 1 до N.
Старый 05.04.2012, 19:47
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
Можешь пойти другим путем:
Изначально не создавать триггеры под спелы,а при выборе спела создавать локальные триггеры и вешать на них нужные события\условия\действия(условия и действия просто изначально вырежи в кастом код карты)
Такой подход уменьшит нагрузку,т.к. будут работать только нужные спелам триггеры(ненужные даже не будут созданы\выключены и на них не будет висеть события соответственно)
Старый 05.04.2012, 19:53
FatalBlade

offline
Опыт: 7,398
Активность:
Да, но тогда спеллы которые будут находиться в конце этого дерева, будут происходить с задержкой. Ведь будут проверяться все равкода до него.
Кстати я не знаю как вообще устроена система самих равкодов, но разве всегда 'A002' > 'A001' ?
FatalBlade добавил:
Nerevar:
Можешь пойти другим путем:
Изначально не создавать триггеры под спелы,а при выборе спела создавать локальные триггеры и вешать на них нужные события\условия\действия(условия и действия просто изначально вырежи в кастом код карты)
Такой подход уменьшит нагрузку,т.к. будут работать только нужные спелам триггеры(ненужные даже не будут созданы\выключены и на них не будет висеть события соответственно)
Мне нравится эта идея. Попробую. Вот только что ты имеешь ввиду вырезать условия и действия? Они ведь создаются в ините каждого триггера. Значит если функции Инит-триггера нету, то и условия и действия тоже не будет. Я не прав?
Старый 05.04.2012, 20:00
prog

offline
Опыт: 32,865
Активность:
FatalBlade, условия, события и действия можно прикрепить к триггеру в любой момент.
Равкод это целое число, на самом деле, просто записанное в непривычной системе исчисления.
Старый 05.04.2012, 20:03
FatalBlade

offline
Опыт: 7,398
Активность:
prog:
Равкод это целое число, на самом деле, просто записанное в непривычной системе исчисления.
Ок. Тогда 'A002' > 'A001'? Или необязательно?
Старый 05.04.2012, 20:06
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
Вырезаешь все функции-действия и функции-условия в отдельный триггер или в кастом код и оттуда добавляешь их в свои локальные триггеры
Старый 05.04.2012, 20:07
FatalBlade

offline
Опыт: 7,398
Активность:
Nerevar:
Вырезаешь все функции-действия и функции-условия в отдельный триггер или в кастом код и оттуда добавляешь их в свои локальные триггеры
Ясно я понял систему. Допустим я хочу сохранить все созданные функции-условия, функции-действия и события в хэш, что бы потом загружать эти функции и "прикреплять" к триггеру. Это возможно? LoadFunctionHandle(...), или LoadEventHandle(...), или LoadConditionHandle(...). Вообще.. функции это что? хэндлы?
Старый 05.04.2012, 20:14
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
m-|
я не об этом
У тебя есть триггеры спеллов
В каждом функции-условия и функции-действия
Вырезаешь их и вставляешь в кастом код
Удаляешь триггеры с остатками инициализации
Когда надо создаешь локальные триггеры с такой же инициализацией и вешаешь на них свои перемещенные условия\действия
???
???
???
профит
Старый 05.04.2012, 20:18
FatalBlade

offline
Опыт: 7,398
Активность:
Nerevar, это я понял. А при выборе спеллов, как создать нужный триггер с нужными условиями и действиями? if spell==Charge then ??? )))
Тут нужна БД на хэше. И при выборе спелла будет создаваться локальный триггер, а к нему вешаться условия и действия из Кастом Кода. А ссылки на условия и действия будут хранится в хэше.
Например для спелла Charge, нужно повесить условие ChargeCondition, и действие ChargeAction. Вот ссылки на эти надо же куда то сохранить, не?))
Старый 05.04.2012, 20:34
ScorpioT1000
Работаем
offline
Опыт: отключен
Сами триггеры то активируются, когда сразу пишешь EnableTrigger( gg_trg_Trigger ), а вот когда я пишу EnableTrigger( LoadTriggerHandle(udg_Hash, id, key) ) - не работает. Почему?
кароче я не читал но отвечу очень просто - сделай массив триггеров и загружай из хеша не триггер а номер ячейки в массиве. и активируй/деактивируй.
для того чтобы не запоминать индексы триггеров, можно юзать
enum(spelltriggers) {
SPELLNAME1_TRIGGERNAME1,
SPELLNAME1_TRIGGERNAME2,
SPELLNAME2_TRIGGERNAME1,
//...
}
Старый 05.04.2012, 20:41
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
call SaveStr(udg_Hash,0,0,"Spell1Init")
call ExecuteFunc(LoadStr(udg_Hash,0,0))
Spell1Init - название функции-инициализации,в которой создается локальный триггер и вешаются условия\действия
Ну и вместо нулей там свои значения,по которым сохраняешь
Старый 05.04.2012, 20:41
FatalBlade

offline
Опыт: 7,398
Активность:
Ок спс попробую
Старый 05.04.2012, 20:46
Закрытая тема

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

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

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

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



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