wait и локальная переменная для юнита, чтобы после вейта там не было чтото другое вместо него. Вейт можно сделать зависящим от уровня способности, через арифметику, или от использованной способности через кучу if-then-else-ов.
если нужно поменять бонус атаки/защиты/... от предмета, это делается через способности.
заходишь в вкладку редактора объектов Способности, папка Особые - там подпапка Предметы, и там находишь предмет-повышение-силы-атаки, создаешь нестандартную и меняешь строку Данные.
потом добавляешь эту способность предмету на вкладке редактора Предметы, в строке Способности
Насколько я помню, при выключении коллизий этой командой юниты получают возможность ходить не только сквозь другие юниты, но и ландшафт, декорации и т.д., в отличие от стремительности.
Нужна переменная. Каждую секунду проверяешь юнитов рядом с точкой, подсчитываешь число героев с обеих сторон, и прибавляешь/убавляешь переменную в зависимости от числа героев.
По достижении +100 точку захватывает одна команда, при -100 другая.
либо через мемхак, либо отслеживать использование способности, устанавливать кулдаун в переменную и уменьшать ее таймером; при достижении нуля считать что способность перезарядилась.
Можно и не буквально скрывать его, а например ставить 100% прозрачность и паузить.
Глянул в статью, ЯТП там предлагается морфать юнита и затем делать цель недостижимой и опять морфать когда надо убрать неуправляемость?
Чтобы юнитом нельзя было управлять, можно использовать PauseUnit, но тогда сам он никуда не будет бежать, и двигать его надо будет триггером.
Скорость выше 522 без триггерного движения тоже не сделать. Также чтобы юнит выглядел бегущим, а не стоящим в полете, его скорость должна быть равна 0 (иначе не проигрывается анимация walk).
Поэтому:
При касте скрываем кастера, создаем даммика с такой же моделью но скоростью 0.
Таймером периодически (25 раз в сек) двигаем даммика к цели. Даммику ставим анимацию "walk" и нужную скорость анимации (чтобы он не слишком медленно дрыгал ногами).
По достижении цели перемещаем кастера к цели, убираем даммика и убираем паузу/ скрытие.
\UI\SoundInfo\UnitAckSounds.slk
в архиве war3x.mpq нашел этот файл. в нем вторая колонка - перечисляются имена файлов, а первая - названия звуков (pissed и т.д.) для всех юнитов
попробуй добавить туда свои файлы во вторую колонку (в строку MaievYesAttack), и импортировать измененный файл в карту по тому же пути.
файлы звуков надо будет импортировать в путь Units\NightElf\Maiev\
Глянул систему античита. ЯТП десинк вызывает создание юнита для локального игрока. Что мешает создавать юнита только для игрока номер N, а номер игрока для сообщения передавать (через синхрон данных) всем? И создавать юнита только после показа сообщения
function SyncInt takes player p, integer val returns integer
if (GetLocalPlayer() == p) then
call StoreInteger(cache, "", "", val)
endif
call TriggerSyncStart()
if (GetLocalPlayer() == p) then
call SyncStoredInteger(cache, "", "")
endif
call TriggerSleepAction(2.)
call TriggerSyncReady()
return GetStoredInteger(cache, "", "")
endfunction
//...
if cheese then
local player p = GetLocalPlayer()
local integer local_val = GetPlayerId(p)
local integer result_var = SyncInt(p, local_val)
call BJDebugMsg("Player "+GetPlayerName(Player(result_var))+" is cheating")
else
endif
ЩАс проверил, если ее нет то кулдаун сбрасывается, если есть идет нормально.
Запихивай в скрытый спелбук если нужно чтобы у второго юнита ее не было, но кулдаун шел.
"если переменная равно 1" засунуть в "иначе" первого условия.
потому что когда они идут подряд, у тебя при "0" станет "1", и сразу за ним выполнится условие на "1"
делать декорацию как юнита со способностью москитов, и менять высоту других юнитов в зависимости от того как они пришли в место над/под декорацией (например хранить координаты и высоту для каждого юнита и узнавать какая высота была 0,05 сек. назад)
quq_CCCP, но сама система же как-то работает? или они там в рандомных местах карты респавнятся?
я написал как работает триггер, в этом примере никаких координат руками писать не надо
переменные через таймер передаются с помощью хэш-таблицы.
GetHandleId( таймер ) - дает число для этого таймера, и на него ты можешь сохранять нужные переменные:
call SaveUnitHandle(hash, GetHandleId(tm), 1212, u_c) - сохраняет юнита, 1212 число должно быть разным для разных переменных
когда таймер истекает:
local timer tm=GetExpiredTimer()
local unit u_c = LoadUnitHandle(hash, GetHandleId(tm), 1212) загружает юнита
call FlushChildHashtable(hash, GetHandleId(tm)) очищает данные по этому таймеру из таблицы
call DestroyTimer(tm) убить ненужный уже таймер
set tm=null
... действия с u_c
set u_c=null
endfunction
хэш-таблицу можно создать при инициализации карты. достаточно одной на все-все таймеры
Ред. biridius
» WarCraft 3 / Как сделать Муи систему камеры?
Ред. biridius
» WarCraft 3 / Изменение анимации (способность)
Ред. biridius
» WarCraft 3 / Изменение значения предмета.
заходишь в вкладку редактора объектов Способности, папка Особые - там подпапка Предметы, и там находишь предмет-повышение-силы-атаки, создаешь нестандартную и меняешь строку Данные.
Ред. biridius
» WarCraft 3 / Как сделать Муи систему камеры?
Ред. biridius
» WarCraft 3 / Воскрешаю героя, а у него сбивается радиус обзора.
» WarCraft 3 / Создать местность, где юниты проходят сквозь друг друга
» WarCraft 3 / Как сделать захват территории?
По достижении +100 точку захватывает одна команда, при -100 другая.
» WarCraft 3 / Насчёт неведимки
Так что можно вместо баффа стремительности вешать триггером обычную невидимость
» WarCraft 3 / Патроны в Инвентаре
» WarCraft 3 / Кулдаун на способность
» WarCraft 3 / Не создаются эффекты на юните
Ред. biridius
» WarCraft 3 / Как сделать рывок?
Глянул в статью, ЯТП там предлагается морфать юнита и затем делать цель недостижимой и опять морфать когда надо убрать неуправляемость?
Ред. biridius
» WarCraft 3 / Как сделать рывок?
Скорость выше 522 без триггерного движения тоже не сделать. Также чтобы юнит выглядел бегущим, а не стоящим в полете, его скорость должна быть равна 0 (иначе не проигрывается анимация walk).
Поэтому:
Ред. biridius
» WarCraft 3 / Где достать "разрушенные" модели?
Doodads\LordaeronSummer\Structures\TowerScorched\TowerScorched
Ред. biridius
» WarCraft 3 / Увеличение количества реплик
в архиве war3x.mpq нашел этот файл. в нем вторая колонка - перечисляются имена файлов, а первая - названия звуков (pissed и т.д.) для всех юнитов
Ред. biridius
» WarCraft 3 / Как передать имя локального игрока всем игрокам?
Ред. biridius
» WarCraft 3 / Как передать имя локального игрока всем игрокам?
Ред. biridius
» WarCraft 3 / Возможность кликать и ходить под декорацией
» WarCraft 3 / Morth
Запихивай в скрытый спелбук если нужно чтобы у второго юнита ее не было, но кулдаун шел.
» WarCraft 3 / Morth
» WarCraft 3 / Как отловить даблклик на гуи?
потому что когда они идут подряд, у тебя при "0" станет "1", и сразу за ним выполнится условие на "1"
Ред. biridius
» WarCraft 3 / Возможность кликать и ходить под декорацией
» WarCraft 3 / Закопавшийся трупоед подозрительно не закопавшийся.
Ред. biridius
» WarCraft 3 / Появление монстров в той же точке
я написал как работает триггер, в этом примере никаких координат руками писать не надо
Ред. biridius
» WarCraft 3 / Ошибка синтаксиса
GetHandleId( таймер ) - дает число для этого таймера, и на него ты можешь сохранять нужные переменные:
call SaveUnitHandle(hash, GetHandleId(tm), 1212, u_c) - сохраняет юнита, 1212 число должно быть разным для разных переменных
local timer tm=GetExpiredTimer()
local unit u_c = LoadUnitHandle(hash, GetHandleId(tm), 1212) загружает юнита
call FlushChildHashtable(hash, GetHandleId(tm)) очищает данные по этому таймеру из таблицы
call DestroyTimer(tm) убить ненужный уже таймер
set tm=null
... действия с u_c
set u_c=null
endfunction