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

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

Ответ
 
Extremator

offline
Опыт: 40,248
Активность:
адд-кондишн унивёрсл
Хотел сделать функцию для регистрации условия каста конкретного спелла.
И выглядеть это должно было так, я беру функцию (свою) и даю ей два аргумента
  • триггер (в который нужно добавить условие),
  • рав-код (проверка которого и будет происходить)
Таким образом мои триггры должны были проходит вот такую регистрацию
call AddCond_EX(t1,'A001')
call AddCond_EX(t2,'A020')
call AddCond_EX(t3,'A300')
call AddCond_EX(tabc,'ABCD')
Но я застреваю вот здесь... и там дальше...
function AddCond_EX takes trigger t, integer id returns nothing
	call TriggerAddCondition(t, Condition(  function Func0001 ) )
	// как сюда затолкать равкод что бы Func0001 его принимал и сравнивал?!
	// или какого типа аргумент туда можно затолкать?
	// да, я вижу что там boolexpr, но что кроме Condition(code) и null туда можно затолкать?
endfunction
function Func0001 takes integer id returns boolean
	return GetSpellAbilityId() == id
endfunction
. . .
В общем - я не знаю как нужно это сконструировать...
И это вообще возможно таким образом завернуть?
Extremator добавил:
» типа моя идея
появилас идея с глобалкой
приравнять к id в AddCond_EX какю нить например udg_id (ну для примера)
а далее в Func0001 уже возвращаться логическую от GetSpellAbilityId() == udg_id
function Func0001 takes nothing returns boolean
	return GetSpellAbilityId() == udg_id
endfunction
Но что будет проверять каждый раз при срабатывании триггера?
  • тот рав-код который я подписал при создании условия для триггера?
  • либо тот, который записан в переменную в более поздний момент времени?
Extremator добавил:
^ идея провалилась, т.к. сравнение идти по последнему результату...
Подскажите, как же всё таки это сделать?
Должно ж быть просто... просто я... что-то не знаю...
Старый 31.08.2014, 09:57
Tobi123

offline
Опыт: 7,826
Активность:
А чем вам обычное добавление условий не угодило?
Старый 31.08.2014, 10:23
Extremator

offline
Опыт: 40,248
Активность:
Tobi123:
А чем вам обычное добавление условий не угодило?
Ну как это чем? :С
вот смотри - я сделаю 100 триггеров, и буду использовать 100 раз функцию AddCond_EX
и она будет задавать одна и та же, и будет делать одно и тоже - сравнивать юзнутый скилл с указанным
а так... мне придё
тся 100 раз ставить добавление условия на отельную функцию !!!!!!
а это ещё 100 функций которые будут просто возвращаться ответы на сравнение юзнутого скилла с указанным
Extremator добавил:
» додумка
подсадить это тёмное дело на глобалку с массивом
function AddCond_EX takes trigger t, integer id returns nothing
	set A = A + 1
	set B[A] = id
	call TriggerAddCondition(t, Condition(  function Func0001 ) )
endfunction
function Func0001 takes integer id returns boolean
	return GetSpellAbilityId() == B[A]
endfunction
да-да, и апать её до упора... не думаю что до 8к абилок доберусь

Отредактировано Extremator, 31.08.2014 в 11:53.
Старый 31.08.2014, 11:35
quq_CCCP
Я белый и пушистый!
offline
Опыт: 94,663
Активность:
Extremator, я пробовал завязать все в 1 триггере все, кст спела, изучение спелла, приказ на каст спелла...
Все работает, аттачим на РО код спелла строку с именем функции и взываем её execute func.
quq_CCCP добавил:
((код jass
function Ability_Conditions takes nothing returns boolean
return LoadStr( gg_htb_HashData, 1, GetSpellAbilityId( ) ) != null
endfunction
))
Вот пример одного условия условия на все спеллы, если в хештаблице нету функции для данного скилла то триггер не выполнит действия.
Базу данных для сопоставления РО коду именам функций думаю реализовать не сложно даже без хештаблицы.
Старый 31.08.2014, 15:25
ScorpioT1000
Работаем
offline
Опыт: отключен
у сижасса же есть всякие эвенты в 1 функцию
Старый 31.08.2014, 15:49
Hate
конь вакуумный
offline
Опыт: 43,124
Активность:
зачем? зачем это делать? я просто не понимаю сути, в чем логика таких манипуляций и чего вы пытаетесь добиться
Старый 31.08.2014, 16:58
quq_CCCP
Я белый и пушистый!
offline
Опыт: 94,663
Активность:
Hate:
зачем? зачем это делать? я просто не понимаю сути, в чем логика таких манипуляций и чего вы пытаетесь добиться
1 триггер, 1 кондишн, 100500 акшенов... Думаю суть понятна...
Старый 31.08.2014, 17:03
Extremator

offline
Опыт: 40,248
Активность:
quq_CCCP:
Hate:
зачем? зачем это делать? я просто не понимаю сути, в чем логика таких манипуляций и чего вы пытаетесь добиться
1 триггер, 1 кондишн, 100500 акшенов... Думаю суть понятна...
100500 триггеров, 1 кондишн, 100500 акшенов...
Старый 01.09.2014, 17:54
quq_CCCP
Я белый и пушистый!
offline
Опыт: 94,663
Активность:
Extremator, так если что, то достаточно всего 1 триггера чтобы обработать все возможные события...
1 триггер, 1 условие, и собственно exeuce func необходимую для данного спелла, нужна только база данных для хранения имен функций которые будут вызваны при соответствии условию.
Старый 01.09.2014, 18:04
adic3x

offline
Опыт: 107,539
Активность:
у сижасса же есть всякие эвенты в 1 функцию
callback onUnitSpellCast ('A000') {
    // ...
}
ADOLF добавил:
И даже обычно создание триггера и нормальное добавление туда события/условия занимает от силы несколько секунд. Но нужно изобретать больше своих нелепых велосипедов.
Старый 02.09.2014, 21:29
XyZoD

offline
Опыт: 2,073
Активность:
Года 2 сюда не заходил не помню как код оформить правильно.
У меня в общем все спеллы карты запускались с одной этой функции. На инициализации карты я заносил в массивы имена запускающих спелл функций:
((код cjass
#define
{
CL_ID = 2235921386
CL_ID_SMALL = 386
}
....
string s = "_Cast";
SPF = Filter(function SpellsCore_Filter);

SPELL_FUNC[CL_ID_SMALL] = "ChainLightning"+s;
...
library SpellsExecuter requires MainCore
{
private void Check(int aId)
{
aId = S2I(SubString(I2S(GetSpellAbilityId()), 7, 10));

if (vIs(SPELL_FUNC[aId]))
{
SetTempInt(0, aId);
ExecuteFunc(SPELL_FUNC[aId]);
DeleteTempInt(0);
}
}
public void Init()
{
trigger t = CreateTrigger();
TriggerRegisterPlayerUnitEventAll(t, EVENT_PLAYER_UNIT_SPELL_EFFECT);
TriggerAddAction(t, function Check);
t = null;
}
}
))
В общем функция запускает функцию через эксекут, которую я занёс в массив строк, индекс которых является последние 3 цифры ида спела. vIs = v != null

Отредактировано Кет, 17.09.2014 в 23:42.
Старый 17.09.2014, 21:36
quq_CCCP
Я белый и пушистый!
offline
Опыт: 94,663
Активность:
papapa071, сабстринги как то не очень, учитывая что id скилла тупо целое число, не проще ли массив строк организовать по принципу:
((код jass
globals
integer udg_offset = 'A000' id самой первой способности.
string array udg_ExecuteList
endglobals
function Ability_Conditions takes nothing returns boolean
return udg_ExecuteList[ GetSpellAbilityId() - udg_offset] != null
endfunction
))
Старый 18.09.2014, 05:52
DioD

offline
Опыт: 45,184
Активность:
опять байтодрочеры....
  1. хеш таблица
  2. триггеры + invoke
  3. профит
и вообще учите нормальные языки и берите с них пример, рекомендую сишарп или яву, оба языка в целом одинаковы.
Старый 18.09.2014, 11:03
quq_CCCP
Я белый и пушистый!
offline
Опыт: 94,663
Активность:
DioD, да все понятно, но не сабстринг от ид абилки...
Перебор уже.
.
Старый 18.09.2014, 11:49
DioD

offline
Опыт: 45,184
Активность:
зачем сабстринг от айди абилки ваще?
вы хоть раз открывали описание хеш таблицы, она число берёт, а не строку.
диагноз - рак третьей степени.
Старый 18.09.2014, 15:05
Doc

offline
Опыт: 63,163
Активность:
у сижасса же есть всякие эвенты в 1 функцию
плохо работает, к сожалению 3:
когда будут те самые "100 спеллов", загнется, а то и раньше
по опыту говорю, были проблемы!
Старый 18.09.2014, 20:18
XyZoD

offline
Опыт: 2,073
Активность:
DioD:
зачем сабстринг от айди абилки ваще?
вы хоть раз открывали описание хеш таблицы, она число берёт, а не строку.
диагноз - рак третьей степени.
Не захлебнитесь желчью, уважаемый. Карта последний раз была сохранена в 2009-2010 году, конечно глупо запускать все спелы в карте 1 строкой кода.
((код cjass
...
ExecuteFunc(SPELL_FUNC[S2I(SubString(I2S(GetSpellAbilityId()), 7, 10)));
...
))
quq_CCCP, я почему то думал что макс ид массива в варе 8192.
Все равно в твоем примере нет универсальности, много кода придется также, а тут 1 строка.

Отредактировано Кет, 19.09.2014 в 16:16.
Старый 19.09.2014, 14:03
quq_CCCP
Я белый и пушистый!
offline
Опыт: 94,663
Активность:
XyZoD:
я почему то думал что макс ид массива в варе 8192.
Так и есть, только причем тут это?
Мы заполняем массив с 0 до 8190, хотя примерно 2000 хватит чтобы карта не запустилась, 2000 абилок многовато для вара, а число функций в j файле....
Старый 19.09.2014, 14:21
DioD

offline
Опыт: 45,184
Активность:
Карта последний раз была сохранена в 2009-2010 году
ой рачьё рачьё, давайте лучше вспомним виндоус 95 который был 10 лет назад популярен и начнём осуждать всех кто сидит на семёрке, а тех кто будет обоснованно против клеймить "тролли захлебнитесь желчью"
Старый 19.09.2014, 15:49
XyZoD

offline
Опыт: 2,073
Активность:
DioD:
Карта последний раз была сохранена в 2009-2010 году
ой рачьё рачьё, давайте лучше вспомним виндоус 95 который был 10 лет назад популярен и начнём осуждать всех кто сидит на семёрке, а тех кто будет обоснованно против клеймить "тролли захлебнитесь желчью"
Продолжать дискуссию с человеком, который смотрит на двигатель и видит лошадь, более не вижу смысла.
Старый 19.09.2014, 17:00
Ответ

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

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

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

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



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