ну я попробывал разобрать твой код : local timer t = GetExpiredTimer() local integer hid = GetHandleId(t) - это ты устанавливаешь целочисленную переменную hid = Хеш-Таблица со значением переменной t? а я не могу через хештаблицу выбрать переменную t
done
Сообщение отредактировал Xan4es - Понедельник, 10 Октября 2011, 11:47:53
Xan4es, GetGandleId(t) - забираю уникальный числовой хендл объекта, чтобы случайно не перезаписать значение, сохраненное в хэш таблице, из другого триггера. Муи, однако
Добавлено (10 Октябрь 2011, 12:28:09) --------------------------------------------- щас такой фейл был - пробывал через спецэффект - и нехера не работало. затем я заметил , что не поставил переодическое событие
Добавлено (10 Октябрь 2011, 12:38:24) --------------------------------------------- Запуск
function Trig_start_Conditions takes nothing returns boolean if ( not ( GetSpellAbilityId() == 'A003' ) ) then return false endif return true endfunction
у меня каждые 0.03 секунды создаётся спецэффект. я делаю переменную - как бы effect = last created special effect ( коряво напиал , но суть ясна ). и затем wait 0.1 , delete effect
1. Создайте функцию, которая бы создавала боевую единицу, проделывая ещё пару действий с ней и возвращала её, не вызвав этим утечки в памяти. (1 балл) 2. Нарисуйте на триггерах или через Jass следующую фигуру (1 балл):
3. Сделайте на триггерах или Jass такое движение фигур (1 балл):
4. Заставьте объект (юнита) после применения способности лететь вверх под прямым углом по траектории, показанной на рисунке (2 балла):
Если вы сделаете это хотя бы на четвёрку, то я считаю, что серьёзному спеллмейкингу вас обучать можно.
Добавлено (11 Октябрь 2011, 11:46:39) --------------------------------------------- Сделал дельтоид. Не удалял молнии, потому как думаю, что для теста это не нужно)
Code
local unit caster = GetTriggerUnit() local real array x local real array y local integer i = 0 local real r = 180. local integer k = 3 loop exitwhen i == 25 if i != 0 then set x[i] = ((k - 1) * r * Cos(r) + r * Cos((k - 1) * r)) set y[i] = ((k - 1) * r * Sin(r) - r * Sin((k - 1) * r)) call AddLightning("DRAL", true, x[i], y[i], x[i - 1], y[i - 1]) set i = i + 1 set r = r + 1. else set x[i] = (k - 1) * r * Cos(r) + r * Cos((k - 1) * r) set y[i] = (k - 1) * r * Sin(r) - r * Sin((k - 1) * r) set i = i + 1 set r = r + 1. endif endloop set caster = null
Для отрисовки других гипоциклоид меняем коэфициент k и подбираем подходящую градусную меру и кол-во точек. Например, астроида рисуется лучше на 90 градусах и меньше.
Добавлено (11 Октябрь 2011, 13:53:23) --------------------------------------------- А вот подоспело движение по спиральной траектории) Взял на себя смелость добавить спускание вниз по этой же траекотрии после достижения нужной высоты
function Trig_Move_Timer takes nothing returns nothing local timer t = GetExpiredTimer() local integer hid = GetHandleId(t) local unit caster = LoadUnitHandle(udg_hash, hid, 0) local real r = LoadReal(udg_hash, hid, 1) local real d = LoadReal(udg_hash, hid, 2) local real x = LoadReal(udg_hash, hid, 3) local real y = LoadReal(udg_hash, hid, 4) local real h = LoadReal(udg_hash, hid, 5) local boolean b = LoadBoolean(udg_hash, hid, 6) if b == false then set d = d + 0.05 set r = r + 4. set h = h + 1.5 set x = GetWidgetX(caster) + d * Cos(r * bj_DEGTORAD) set y = GetWidgetY(caster) + d * Sin(r * bj_DEGTORAD) call SetUnitFlyHeight(caster, h, 0.) call SetUnitPosition(caster, x, y) call SaveReal(udg_hash, hid, 1, r) call SaveReal(udg_hash, hid, 2, d) call SaveReal(udg_hash, hid, 3, x) call SaveReal(udg_hash, hid, 4, y) call SaveReal(udg_hash, hid, 5, h) if h >= 350. then call SaveBoolean(udg_hash, hid, 6, true) endif else set d = d - 0.05 set r = r + 4. set h = h - 1.5 set x = GetWidgetX(caster) + d * Cos(r * bj_DEGTORAD) set y = GetWidgetY(caster) + d * Sin(r * bj_DEGTORAD) call SetUnitFlyHeight(caster, h, 0.) call SetUnitPosition(caster, x, y) call SaveReal(udg_hash, hid, 1, r) call SaveReal(udg_hash, hid, 2, d) call SaveReal(udg_hash, hid, 3, x) call SaveReal(udg_hash, hid, 4, y) call SaveReal(udg_hash, hid, 5, h) if h <= 0. then call PauseTimer(t) call DestroyTimer(t) call FlushChildHashtable(udg_hash, hid) endif endif set t = null set caster = null endfunction
function Trig_Move_Actions takes nothing returns nothing local timer t = CreateTimer() local integer hid = GetHandleId(t) local unit caster = GetTriggerUnit() local real r = 0. local real d = 8. local real x = GetWidgetX(caster) + d * Cos(r * bj_DEGTORAD) local real y = GetWidgetY(caster) + d * Sin(r * bj_DEGTORAD) local real h = 10. if UnitAddAbility(caster, 'Amrf') then call UnitRemoveAbility(caster, 'Amrf') endif call SaveUnitHandle(udg_hash, hid, 0, caster) call SaveReal(udg_hash, hid, 1, r) call SaveReal(udg_hash, hid, 2, d) call SaveReal(udg_hash, hid, 3, x) call SaveReal(udg_hash, hid, 4, y) call SaveReal(udg_hash, hid, 5, h) call SaveBoolean(udg_hash, hid, 6, false) call TimerStart(t, 0.03, true, function Trig_Move_Timer) set caster = null set t = null endfunction
//=========================================================================== function InitTrig_Move takes nothing returns nothing set gg_trg_Move = CreateTrigger( ) call TriggerRegisterAnyUnitEventBJ( gg_trg_Move, EVENT_PLAYER_UNIT_SPELL_EFFECT ) call TriggerAddCondition( gg_trg_Move, Condition( function Trig_Move_Conditions ) ) call TriggerAddAction( gg_trg_Move, function Trig_Move_Actions ) endfunction
Xan4es, Ty3uK, Маньяк-геометр? 2 балла за спираль, балл за грамотную дельтоиду. Ещё и отмикродекорил молниями... Достоин) Но вот не порадовало опять то, что ты массив X и Y создал - тут можно и без него. И иф в цикле убери. Задания 1 и 3 делай, дерзай.
Лучше бы научили делать сборку предметов как в доте у ИИ.
Скажи мне, Лавс, что её делать-то?) Там прописаны различные варианты сборок предметов (по словам Себры, который помогал с ИИ в доту), комп выбирает оптимальнейший вариант, дальше идёт проверка на золото и всё такое прочее. И собирает.
4. Заставьте объект (юнита) после применения способности лететь вверх под прямым углом по траектории, показанной на рисунке (2 балла):
Это же движение по прямой и по окружности.
Quote (|DUОS|)
3. Сделайте на триггерах или Jass такое движение фигур (1 балл):
Две окружности: одна увеличиваеться в диаметре другая уменьшаеться?! Когда у них будет равынй деаметр то установить им оригинальный диаметр.
Добавлено (11 Октябрь 2011, 17:27:38) ---------------------------------------------
Quote (|DUОS|)
Скажи мне, Лавс, что её делать-то?) Там прописаны различные варианты сборок предметов (по словам Себры, который помогал с ИИ в доту), комп выбирает оптимальнейший вариант, дальше идёт проверка на золото и всё такое прочее. И собирает.
А ты меня на учишь? Я как только не делал, пробовал через структуры с методами. Да я понял что там идет как бы оптимальный вариант сборки но как его реализовать?
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Вторник, 11 Октября 2011, 17:29:41
Это я тоже понял и пытался сделать. Например: прописана полная сборка сапога с рецептом, для ее сборки нужно 2000 золота, бот подходит к магазину и сравнивает сколько у него золота, потом смотрит каким героем он являеться магом ловкачем или силовиком, для ловкача это я делал первым приоритетом сборки сапога, тоесть пока он сапог не соберет он не перейдет к другим предметам, сборка автоматичская но она последовательная, у меня бот не мог определить если у него 1999 золота то он может купить не предметы для сапога а чтонибудь другое - он неможет одновременно собирать несколько предметов одновременно. Кароче научи меня!!!
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Вторник, 11 Октября 2011, 17:35:26
А ты меня на учишь? Я как только не делал, пробовал через структуры с методами. Да я понял что там идет как бы оптимальный вариант сборки но как его реализовать?
Конечно, научу.
Как ты понимаешь, ИИ нуждается в отдельной хэш-таблице. Условно назовём её AI_Hash. Тактики для ИИ продумывает сам человек-разработчик, как ты понимаешь. На каждый юниттайп героя вешаются предметы, сильные против него (на индекс 0) и слабые против него (на индекс 1) таким образом:
Так бот понимает то, что собирать против героя типа unittype, а что явно исключать из своих планов. Как работать с итемпулом, ты знаешь? Если нет - напиши сюда, поясню. Если играет несколько героев, бот должен выяснить, а есть ли такой тип предмета, который бы был эффективен против большинства играющих противников. Если да, то наверняка бот сделает ставку на сбор этого предмета. В общем, основная фишка, заставить бота думать так, как думает хорошо шарящий в этом плане человек.