26

» WarCraft 3 / Как сделать систему поломки предметов?

Когти + индексация
Всё, что тут сложного?
Хочешь что бы бафф отображался - даёшь ещё ауру на самого себя
Готово. И эту абилку ничем не задиспелить (если не сделать триггер отдельный).
26

» WarCraft 3 / Загруз по по поводу переменной

SсRealm:
Поясню. Способки даются герою рандомно и мне нужно их систематизировать, то есть игрок будет получать способности в рандомном порядке и мне нужно понять какая из них получена только что чтобы управлять ими в дальнейшем
Звучит так, как-будто у тебя там имеется массив из абилок и ты выбираешь одну конкретную по номеру. Например
set passAbility[1] = Доспехи Веры
set passAbility[2] = Аура Смерти
set passAbility[3] = Змеиная Ловкость
а дальше ты получаешь число N, например - 2, и с ним работаешь
Действие - Выдать юниту абилку passAbility[N]
Т.е. ты тут можешь сразу работать с числом N что б получить саму абилку
Либо отдельно сделать запись "последняя выданная абилка" (отдельная переменная)
Действие - Выдать юниту абилку passAbility[N]
set lastAddAbility = passAbility[N]
Я бы тогда вообще сделал отдельную функцию выдачи абилки, если она часто используется в таком виде и/или где-то ещё.
function UnitAddAbilityToLast takes unit u, integer i returns
	call UnitAddAbility(u,i) // native func.
	set bj_LastAddAbility = i // global val.
endfunction
Действие - call UnitAddAbilityToLast( твой_юнит, passAbility[N] )

SсRealm:
Короче я нашел ужасное упущение варика. Странно, что все на свете можно записать в переменную, но только не только что приобретенную способность.
Есть такой объект как Абилка, но действий с ним либо нет, либо их всего несколько, т.к. все действия с абилками происходят через обращение к её равкоду. Работает это примерно как с предметами в инвентаре героя:
Ты ссылаешься на удаление предмета определённого типа (число) у юнита, при это запускается цикл который проверяет все слоты инвентаря у указанного юнита, и каждый предмет (объект) в каждом слоте проверяет по его ID (как число), и как только он совпадает с искомым - тебе возвращается ссылка на этот предмет (как объект). После чего происходит удаление конкретного предмета, если ты его пытался получить по ID (число). А вот если ты будешь ссылаться на "предмет которым манипулировали", тогда ты получишь конкретно сам предмет (объект).

Вот с абилками, примерно, так же и получается.
Ты посылаешь в функцию ID абилки, и дальше игра сама ищет эту абилку у юнита (какой там механизм - хз, но результат схожий). Функция "использованная абилка" для события каста, так же возвращает тебе всего лишь ID абилки (число), а не её саму как объект.
Мб это и правильнее, т.к. для удаления конкретной абилки (объекта) у юнита тогда бы пришлось иметь в записи саму абилку (объект). А это довольно сильно усложнило бы на первых этапах понимание сути вещей в среде редактора (повышение уровня вхождения).

constant native GetSpellAbilityId takes nothing returns integer
constant native GetSpellAbility takes nothing returns ability
Вот обычно когда идёт триггерная проверка на то какой скилл был использован - проверяется его ID (число), т.е. используется первая фунция и возвращается номер, с которым ты сравниваешь свой номер (эти номера имеют вид 'A002').
Нативки
native GetUnitAbilityLevel takes unit whichUnit, integer abilcode returns integer
native DecUnitAbilityLevel takes unit whichUnit, integer abilcode returns integer
native IncUnitAbilityLevel takes unit whichUnit, integer abilcode returns integer
native SetUnitAbilityLevel takes unit whichUnit, integer abilcode, integer level returns integer
native UnitAddAbility takes unit whichUnit, integer abilityId returns boolean
native UnitRemoveAbility takes unit whichUnit, integer abilityId returns boolean
native UnitMakeAbilityPermanent takes unit whichUnit, boolean permanent, integer abilityId returns boolean
native SetPlayerAbilityAvailable takes player whichPlayer, integer abilid, boolean avail returns nothing
Каждая из этих функций использует, как сам видишь, именно ID абилок (число).
Хотя для записи/выгрузки абилки из хэш таблицы используется ссылка как раз на саму абилку (объект)
native SaveAbilityHandle takes hashtable table, integer parentKey, integer childKey, ability whichAbility returns boolean
native LoadAbilityHandle takes hashtable table, integer parentKey, integer childKey returns ability
26

» WarCraft 3 / Загруз по по поводу переменной

Т.е. тебе надо выдавать юнита абилку с возможностью получить "последнюю выданную способность", так что ли?
26

» WarCraft 3 / Иконки на заказ

Хоффман, а вот это видел? - www.hiveworkshop.com/resources/btnicegiant.52026
Чем-то смахивает на твою модельку ))

Оо, я тебе даже больше скажу - они одинаково называются.

А вот кстати и сама моделька от того же автора - www.hiveworkshop.com/threads/ice-giant.62043
Так что всё есть в одном комплекте, надо просто проверять ))
26

» WarCraft 3 / Как забыть улучшение

Qulore:
То есть на 1.26a никак не получится?
В требовании надо будет поставить юнита.
Временно создаёшь его игроку, для разблокировки.

Либо замена одной абилки (выкл-версия) на другую (вкл-версия).

А на поздних патчах можно просто блокировать саму абилку.
Так что я хз что они тебе тут залечивают.
26

» WarCraft 3 / Увеличение дистанции атаки

Принятый ответ
По дефолту это улучшение.
Герой игрока качает абилку - триггерно это отлавливается и повышается уровень улучшения для этого игрока. А само улучшение это аналог длинноствольных мушкетов. Оно должно быть у твоего героя в разделе улучшений, что бы оно на него работало.
Событие - Боевая единица повышает уровень способности
Условие - сравнение способностей героев - изученная способность = твоя_абилка
Действия - Игрок - Установить уровень улучшения (мушкеты) для игрока (владелец юнита-инициатора) на уровень (уровень изученной способности).
26

» WarCraft 3 / Спец.эффект на "Демоническую силу"

В момент прокачки этой абилки на 1й уровень выдай герою абилку-пустышку с аттачем (прикреплённым спецэффектом). Да, триггерно.
Триггеры начинаются с малого.
Сегодня ты просто даёшь ещё одну абилку при прокачке другой.
А завтра уже пытаешься уйти от какой-то базовой механики игры...
26

» WarCraft 3 / Таймер вместо вейт

SсRealm, ты меня не понял. Я прошу тебя сформулировать конкретную ситуацию, когда тебе нужна такая 20-ти секундная отсрочка. Тот вэйт что я тебе дал, точно так же косячит как и обычный, просто в другом месте. У него погрешность от 0.075 до 0.125 (чаще всего всё же выдаёт 0.100), которую надо либо вычитать из стартового времени, либо допускать как побочную (т.е. внутри можно сделать set s = s - .1 , но это всё равно не поможет если время меньше 0.1 сек).
Лучше всего - юзать таймеры. Как их юзать - тут надо уже понимать чуть больше, чем просто то как из запускать и реагировать на них.
26

» WarCraft 3 / Таймер вместо вейт

И ты продолжаешь спрашивать?
- Вот тебе красный.
- Это красный?
- У него цвет как у красного.
- Ну так это красный?
26

» WarCraft 3 / Таймер вместо вейт

ScopteRectuS:
Extremator, разве функция, которую ты скинул не есть стандартный гуишный вейт?
Кэп?
26

» WarCraft 3 / Таймер вместо вейт

SсRealm:
функция не работает
Он же тебе пишет, что функция с этим названием не объявлена.
Т.е. ты не занёс её в шапку или в другое место, где она должна объявляться раньше чем упоминается.
Я тебе в сообщении выше пример прилепил.
26

» WarCraft 3 / Таймер вместо вейт

МрачныйВорон:
а я про что говорю?) что вэйт немного медлителен.
Ты бы ещё запятые расставлял в нужных местах )

SсRealm:
У меня call WAIT_EX( 20. ) не работает(
Мб ты не так сделал. Вот здесь работает.
К тому моменту когда ты найдёшь в чём реальный косяк такого вэйта, тебе уже не нужен будет вэйт.
Загруженные файлы
26

» WarCraft 3 / Таймер вместо вейт

МрачныйВорон:
а вэйт в 0.00 сек заметно дольше кажется 1 сек ушла у него.
Данная информация совершенно не соответсвует действительности.
У меня бывают момент когда мне надо заставить триггер прождать МГНОВЕНИЕ, что бы не сбить что-то, и вот вэйт в 0.00 не помогает, т.к. срабатывает мгновенно, т.е. слишком быстро.
SсRealm:
А вот этот код нельзя на custom script записать, а то я е пойму как мне выйти на этот таймер?
Можно, обычно туда его и кидают.
Мб я по памяти не совсем правильно что-то написал, надо проверить самому.
26

» WarCraft 3 / Таймер вместо вейт

SсRealm:
То есть я пишу этот код и вейты больше не глючат?
Нет)) это так не работает.
Если ты хотя бы немного понимаешь как работает Jass, то просто используй это вместо вэйта.
Вот так. В данном случае 10. это 10 секунд.

SсRealm:
но если вейты так глючны, то почему бы просто не сделать отчет на локалках или глобалках?
Ответ на твой вопрос - таймер.
Хочешь записывай его в локалку, а потом ищи что и с кем делать (на это надо записать).
Хочешь записывай его в глобалку, а потом ... точно так же ищи что и с кем делать.
Загруженные файлы
26

» WarCraft 3 / Таймер вместо вейт

SсRealm:
Варик может тупануть.
Не может. У всего происходящего есть своя последовательность. Затереть юнита инициировавшего ивент не так уж и просто, но способы есть. В основном все проблемы с потерей такого юнита сводятся к тому что сам вэйт ни при чём, а всему виной каша идущая до/после.
По поводу вэйта - если уж не нравится стандартный, то как вариант, сварганить и юзать что-то на подобии этого:
function WAIT_EX takes real s returns nothing
	local timer t = CreateTimer()
	call TimerStart(t,s,false,null)
	loop
		call TriggerSleepAction(s)
		exitwhen TimerGetRemaining(t) == 0.
	endloop
	call DestroyTimer(t)
	set t = null
endfunction
26

» WarCraft 3 / Не работает простой Триггер (рефоржет)

Ты вот ссылаешься на "конструктед структур", а ты знаешь какой именно это юнит? выведи на экран его имя.
Ты отдаёшь конкретному юниту приказ тренить юнита, а он там вообще есть? тоже надо проверять

Если у тебя что-то не срабатывает - ищешь конкретно то место где происходит ступор, расставляешь вывод текстов с именами юнитов и прочего. И тут же видишь что и где идёт не правильно.
26

» WarCraft 3 / Как сделать упровление как в клешь рояле

Принятый ответ
Скорее всего созданный юнит передаётся под управление другому игроку, который отыгрывает роль безконтрольной армии игрока.
26

» WarCraft 3 / Рудник рядом с зданием

vlad777:
как через тригеры?
Надо раскрыть функцию спавна андедов и посмотреть каким именно образом там меняется здание (рудник) и что делается попутно. А так вообще думаю тебе хватит простой замены юнита, через реплейс (есть такая функция - замена юнита с сохранением параметров хп/мп)
26

» WarCraft 3 / Формула плавного замедления через дистанцию

Proshel_Doty:
если не менять дистанцию
Поэтому, если дистанция динамическая, то можно выводить скорость из неё.
26

» WarCraft 3 / Формула плавного замедления через дистанцию

Proshel_Doty:
ну я и посчитал, точнее excel за меня разложил всё
Мб ты тоже попробуешь посчитать прежде ? )
Поэтому базовую скорость и множитель замедления надо подкручивать
и как ты собрался подкручивать множитель?
Подкручивая базовую скорость с такой формулой ты никогда не добьёшься желаемого
Ну вот я поставил s9. - этого мало, число уходит в 0 гораздо раньше нужного.
Подкрутил до s12. - лучше, но всё ещё мало.
Подкрутил до s18. - ещё лучше, но движение менее плавное стало.
Подкрутил множитель до .94 - стало нормально.
При скорости 2.064 дистанция падает на 0.339 а потом до 0 = таймер паузится.
Вот я и не добился желаемого подкручивая множители... вообще ни разу.
26

» WarCraft 3 / Формула плавного замедления через дистанцию

Proshel_Doty:
и каким образом ты хочешь получить дистанцию меньше текущей скорости по такой формуле? Она там в принципе никогда не будет меньше.
Ну а ты посчитай ))
rsfghd:
Видимо я что-то неправильно сделал, ибо скорость падает до 0, а дистанция нет (33.999 висит), в итоге даже таймер не выключается.
Поэтому базовую скорость и множитель замедления надо подкручивать.
Это ж не формула от и до, это топорный вариант.