Второй комп сломан поэтому проверить не могу, почему у меня подозрение, что оно должно работать.... Хотя могу и ошибаться, нормально делал карты года 2 назад.
а) Создай 2 переменные-массива по типу "боевая единица" (массив - чтобы для каждого игрока, мы ведь за мультиплеер трем, прально?), назови типа MyChampion и MyChampionDummy.
б) подготовь невидимого героя-пустышку с нужной тебе иконкой, убери ману, если у чемпиона ее нет. Убери ему радиус обзора, убери галочки типа "отмечать на мини-карте" - остальные - опционально.
В дальнейшем мы будем синхронизировать пустышку и реального чемпиона, создавая видимость одной боевой единицы.
Итак, наш первый триггер:
в) Отследи первое появление чемпиона, когда это случится - создай для игрока героя-пустышку. Соответственно сделай MyChampion [number of (Owner of trained unit)]= last trained unit, следующей строчкой создай того самого героя-пустышку для (owner of trained unit) и сделай MyChampionDummy = last created unit. Теперь мы прочно связали этих чуваков. Этот же триггер запускает остальные.
г) Отслеживание здоровья. Сделай изначально выключенный цикличный триггер, там, каждые 0.3 секунды. Триггер запускается пунктом в). Каждые 0.3 секунды меняй здоровье героя (чья икона висит, надо чтобы она соответствовала, прально?) в % на здоровье самого чемпиона.
д) пропищи событие, мол, если выбирает игрок своего героя (кликая на иконку) выбирается чемпион
е) убивай героя вместе с чемпионом
ж) отключай триггеры с проверкой и выбором, пока чемпион мертв
з) не забывай обновлять переменную чемпиона с каждым новым чемпионом.
Понадобится переменная содержащая количество играющих.
Делай по принципу апгрейда крепости в замок. Только у базового здания несколько апгрейдов, на каждую расу. И триггером увеличить переменной +1 по окончанию апгрейда.
Когда у переменной значение становится равное количеству играющих, создаешь работников.
Я решил проблему, используя обработчики событий BlzTriggerRegisterPlayerKeyEvent и EVENT_PLAYER_MOUSE_DOWN
При нажатии правой кнопки мыши проверяется наличие живого героя и селекция юнитов, если в ней нет юнитов которыми игрок может управлять (или вообще никто не выбран) то юнит моментально отправляется приказом "move" в точку, на которую кликнул игрок и сразу выбирается.
При нажатии клавиши герой просто выбирается.
примергде-то надо еще таймером будет. просто по идее система работает так: происходит событие изменения ресурса (запоминаем сколько), следом происходит основное событие (покупка-продажа). значит, здесь ловим итем, потом вычисления с налогами. Но такой порядок бывает не всегда. Вот допустим продажа: сначала продаем (итем забирают, событие продажи), потом дают деньги (событие изменения ресурса). как видишь, здесь надо тогда таймером через 0.00 сек или сколько то сек проверять измену реса
хотел реализовать похожую систему (проводить торговлю не через чат, а через кнопочки). только на мем хаке. изменить можно только в мем хаке. если вы изменяете цену типу предмета, тогда она у всех итемов данного типа меняется. сделал так: копию на каждого игрока, у одного будет одна цена, у другого другая. короче каждый игрок товар может предложить по разной цене. как это будет работать пока не знаю (я не все продумал, и поэтому не доделал).
можно стоимость убрать и триггерами начислять/убавлять
используй подходящие константы к конкретным событиям триггера.
продажа итема
событие - юнит закладывает предмет в лавку
переменные:
GetSellingUnit() =продающий торговец (типа всякие предметы закладывает в магазин и получает деньги)
GetBuyingUnit()=GetTriggerUnit() = покупающий торговец (это обычно магазин)
покупка итема
событие - продает предмет (из лавки)
GetSellingUnit()=GetTriggerUnit() =продающий торговец (в данном случае магазин продает нам)
GetBuyingUnit() = покупающий торговец (это наш герой отдает денюшку, а сам получает артефает или лошадь)
А предмет который продают или покупают
GetSoldItem()
Вджасс это дополнение к обычному джассу, у себя ты можешь видеть строки объявления библиотеки, продвинутые комментарии и статические константные переменные
Возможно у тебя реально проблема в последней, например он сканирует список всех карт, находит какое-то непотребство и падает в ошибку, надо проследить и почистить этот путь
Я не понимаю как работать без него, особенно без ро
В идее выбираешь режим редактор, а не игры, и работаешь в редакторе как обычно
Такой ауры нету, есть аура на бонус атаки (наверн, это не то, что вам нужно). можешь посмотреть список
Можно сделать триггерно, делаешь ауру пустышку. Потом систему урона, в этой системе проверяешь наличие баффа ауры. Наносишь доп урон. Ну, и конечно, надо знать какой дамаг от магии, или физическ. Это тоже надо подумать. Вроде, столько систем на определения придумано
можно еще каждые 2-3 сек выделять всех вокруг кастера в группу и что-то делать с этими юнитами, добавляя им бонусы: реген, защита и пр
Если заклинания триггерные, то можно проверять висит ли на кастере бафф, и увеличивать дамаг. Многие стандартные способности можно сделать триггерно
GearOfRage, в данном случае надо тестировать кампанию, а не саму карту. Открываешь через игру доп кампанию и играешь нужную миссию (для этого надо сделать все миссии временно доступными)
Виджитайзер норм, если правильно все делать. Ultimate Slk Opt быстрый, но надо держать ухо в остро, то будет карта с иероглифами. AntiMage:
quq_CCCP, виджитайзер слишком медленный, Ultimate opt непонятный, +они оба ведь защишают карту, мне этого ненужно тоесть я хочу чтоб мои обьектные данные о войсках и.т.д обратно восстановились когда угодно, чтоб world editor мог открывать
А нах юному IceFrog'у понадобилась слк оптимизация? Тем более виджитайзер ничего не защищает, но чтобы работать с данными карты в редакторе достаточно распаковать их из карты в папку с варом и все, странно что у вас нет других проблем о которых бы следовало спросить на форуме.
логика такова
цикл от 1 до всех предметов в карте призван Установить для Каждого Item_Init[Cnt_Item_Init]
Значение взятое из SetItemUserData
для удобства занес эти Значения в Переменную типа Массив чтобы Оперировать с ними там где мне это нужно
и когда в инвентаре окажется Индекс этого предмета я буду знать что этот предмет мне нужен для Удаления
для этого есть функция
function F_H_Section_ReturnItem takes unit u, integer id returns nothing
set Cnt_Inv = 0
loop
exitwhen Cnt_Inv > Min_Inv
set ItemsInSlots[Cnt_Inv] = UnitItemInSlot(u, Cnt_Inv)
if LoadBoolean(H, StringHash("H"), StringHash("RemoveItems")) then
call SaveBoolean(H, StringHash("H"), StringHash("RemoveItems"), false)
call RemoveItem(ItemsInSlots[Cnt_Inv])
else
if GetItemTypeId(ItemsInSlots[Cnt_Inv]) == id then
call SaveBoolean(H, StringHash("H"), StringHash("RemoveItem"), true)
call RemoveItem(ItemsInSlots[Cnt_Inv])
endif
endif
set Cnt_Inv = Cnt_Inv + 1
endloop
set Cnt_Inv = 0
loop
exitwhen Cnt_Inv > Min_Inv
set ItemsInSlots[Cnt_Inv] = null
set Cnt_Inv = Cnt_Inv + 1
endloop
endfunction
достаточно одно SaveBoolean и готово
а дальше Создание предмета ПО Индексу расположенный в Item_Init
call SaveBoolean(H, StringHash("H"), StringHash("RemoveItems"), false)
призван удалить Все предметы из инвентаря Без проверки GetItemTypeId
либо использовать вариант который написал nazarpunk:
тут уже мне решать
function F_Pick_Item takes nothing returns nothing
set Cnt_Item_Init = 1
loop
exitwhen Cnt_Item_Init > Item_Init_Number_End
call SaveBoolean(H, StringHash("H"), StringHash("ItemUserDataSave"), true)
call SaveItemHandle(H, StringHash("H"), StringHash("ItemUserData"), GetManipulatedItem())
if GetItemTypeId(GetManipulatedItem()) == Item_Init[Cnt_Item_Init] then
set ItemUserDataMas[ItemUserDataAmount] = Cnt_Item_Init
endif
set Cnt_Item_Init = Cnt_Item_Init + 1
endloop
call F_H_Section_ItemUserData()
Ну если взять стандартное мили 1х1, где обычно катки длятся 10-15 минут, то думаю афк на 2 минуты уничтожит игрока на первых 10 минутах. Если катка затянулась на полчаса, то афк 5-10 минут может уничтожить игрока. Если игра затянулась на 10 часов, то думаю, часок можно и поафкашить.
Вот тут афк на 6.5 часов было норм для игроков
Так что все зависит от игры, геймплея, условий, где это критично а где нет. Может быть у тебя будет не конкретное число минут для определения афк и передача войск союзнику, а прогрессирующая шкала, чем дальше катка тем дольше можно быть афк, ибо самая жара действий обычно происходит на старте-середине игры.
И я не уверен, что стоит кикать игрока, можно просто передать контроль союзникам, пока он не вернется. Но это уже твоя авторская идея и система, как посчитаешь правильным для своей карты.
И да, АФК - от англ. AFK = Away From Keyboard, что в переводе отошел от клавиатуры.
Создай изображение размером 256x256. Конвертируй его в формат TGA. Переименуйте в war3mapPreview.tga и загрузите в карту, в карте уберите путь war3mapimported
WW перестаёт становиться DIS, когда у героя более одной абилки WW
типа что бы ты мог активировать другой, пока работает первый... но разблокировка идёт на все сразу (и на сам себя тоже)
Extremator предлагает делать переключение через выделения таверн через триггеры. Выделение с одной снял, выделение на другую переключил.
Хоттаб, предлагаю другой вариант - ОДНУ таверну со всеми героями. пример с итемами, там переключение система 14 верс
есть пример, тоже самое можно сделать например для героев. По идее можно всех-всех героев заранее забить в таверну. Так можно сделать ОДНУ таверну со всеми героями, но с переключением списков. Так можно сделать, это надо в РО забить всех героев в таверну, если не получается пробуйте через клавишу Shift. Но будет отображаться только первые 10-12, остальные не вместятся на панеле. Поэтому надо разбить героев на списки.
Можно спрятать всех героев, кроме определенных героев, находящей на первой странице. А когда нажимаешь, то прячешь для игрока одних героев на 1 странице, и показываешь других героев на след странице.
как прятать героев вот ссылкакогда задаешь лимит обучения данного типа ноль, то иконка этого героя исчезает. прячешь одних. разблокируешь других.
Еще раз, 'Aams' - щит от магии, он дает маг имун и только. 'Aam2' - нейтрализует урон от магии, при этом в цель можно применять заклинания, обрати внимание там другой бафф.
Для каждого дерева нужны три модели: обычная, неактивная (с названием Doodads\Terrain\AshenTree\AshenTree0S.mdx, например) и неактивная разрушенная (Doodads\Terrain\AshenTree\AshenTree0D.mdx). У неактивных моделей должна быть только одна анимация — Stand. У первой — только деревце, у второй — только пенёк, соответственно.
Когда с деревом никто не взаимодействует, отображаются неактивные модели. Ты их не заменил, потому такая вот фигня.
Как сделать полноценно работающие деревья с моделями, не заменяющими стандартные, я не знаю. Возможно, никак.
Мб оно связано с морфом, или с какими то параметрами заклинания - в доте аватар превращал тинкера в танк..
Можно попробовать морфнутся в альтернативного тинкера скиллом 'Aave' - превратится в сфинкса, тогда он навсегда останется тинкером в ульте.
Не должно так критовать. А ты добавлял юнитов в unit ui slk и unit abilities slk? Туда тоже надо добавлять.
Ещё желательно править не neutral unit string, а human unit string или orc unit string.
Кроме того, надо править human unit func. txt или orc unit func. txt
Далее: custom v0 и melee v0 не обязательно править, достаточно добавить файлы в папку units архива и в папку custom v1. просто непонятно, зачем делать юнитов для версии Roc
SirDragdord, никак, последние патчи баганые, там много чего не работает, играть там не вочто, хотите поиграть - 1.26а к вашим услугам, старшие патчи вара только для ознакомления и обучения, пока не вышел рефордж там нечего делать.
Кажется проблему решили, ответ крылся в текстурах, скорее всего в типе сжатия Sequental JPEG при пресохранени с другим типом сжатия (Пересохранил текстуры в тга и обратно в блп) - проблема решилась (По крайней мере сейчас так кажется).
Из чего могу предположить, то при определенных обстоятельства Варик или система неадекватно воспринимает текстуры с этим типом сжатия и выпадает
Создаем целочисленную переменную.
В редакторе тригеров:
Действия: Время суток становится 6 утра
Условия: Ставим если надо
Действия:
Установить переменная + 1
Вывести текст на экран наша переменная
library RPGText
globals
private unit array s
private real array d
endglobals
function displayTextExp takes nothing returns nothing
local timer t = GetExpiredTimer()
local unit u = s[GetHandleId(t)]
local real r = d[GetHandleId(u)]
// дальше уже можно шаманить с текстом
// Очишаем утечки
call DestroyTimer(t)
set u = null
// А также очистка массива
//
//
//
endfunction
function createText takes unit u, real r, code c returns nothing
local integer i = GetHandleId(u)
local timer t
if d[i] == 0 then
set t = CreateTimer()
// Записиваем значение
set s[GetHandleId(t)] = u
set d[i] = r
call TimerStart(t, 0.03, false, c)
set t = null
else
set d[i] = d[i] + r // Увеличивает число
endif
set u = null
endfunction
endlibrary
Такую систему сделать можно, но через создание локальных (через локальные переменные) триггера входа в область, области, таймера и принудительной смены координат входящего в область юнита, после проверки на владельца юнита, с добавлением спецэффектов в точке входа и в точке перемещения. После истечения таймера удалить область, таймер и триггер. Получится временный портал, работающий на опрелеленных юнитов. Такая система будет MUI, но её не получится сделать с помощью только GUI... придётся кодить
Нашёл систему, где звук передаётся в таймер, который истекает через 0 секунд. В результате один и тот же звук может проигрываться несколько раз без всяких проблем. В инетике пишут мол это такой баг движка.
Юнитов поднимает тогда же, когда и опускает, потому что я удаляю их из DedG[3], но забываю удалить из группы снарядов, таким образом, к тем кто попал под падение, уже навечно задействован акт снарядов(опускание), пока они в DedG[3]
похоже более всего на мусор, попадающий в память откуда-то извне. Обычно пропущенная строка автокаста такой фигней страдает. Нельзя точно сказать, нужно менять поля и смотреть. К счастью, описания можно менять и локально, не перепаковывая карту
можно задать постоянную музыку при входе юнита в область.
А выключать её по событию "юнит покидает область".
Они же рядом события эти, чего усложнятьв сё.
Ну, только массивами. У тебя просто нет бд, где прописаны области.
Либо, вы берете записываете бд:
R - массив областей rect, это прямокгольные области rectangle
В триггере инициализайии прописываешь все массивы:
R [1] = область 0001
R [2] = область 0002
R [3] = область 0003
Когда нужно, создать юнита в ранд точке в R [ random от 1 до 3]
Другой вариант. Есть только регион Region, но там не помню как работает. В него можно засунуть несколько rect. Есть функция добавления области в регион. Но аот применять этот регион сложна. Я помню есть функция, поищи: рандомная точка в регион. Ты можешь сразу спавнить в рандом точке. К сожалению, не нашел нв хигаме GetRandomPointInRegion()
» WarCraft 3 / выбор расы на игроков
» WarCraft 3 / Отдельный файл
» Game Dev / Lumalabs.ai - текст в 3D
» WarCraft 3 / Управление неподконтрольным юнитом
» WarCraft 3 / Продажа предметов
» WarCraft 3 / Вылезает ошибка(только эта)
» WarCraft 3 / Прогрузка карты в редакторе
» WarCraft 3 / Аура дамага
» WarCraft 3 / Проблема с созданием предмета
» WarCraft 3 / Герой: Hogger
» WarCraft 3 / Зрители
» WarCraft 3 / Проблема с тестом карты
» WarCraft 3 / Изображение
» WarCraft 3 / Редактор на заказ
» WarCraft 3 / ИИ героев
» WarCraft 3 / Невосприимчивость к аурам
» WarCraft 3 / Вариации моделей юнита.
» WarCraft 3 / Карта не запускается
» WarCraft 3 / Сделайте наработку.
» WarCraft 3 / Undead Doodad Pack
» WarCraft 3 / Как обнулить данный тип переменной
» WarCraft 3 / области