Deepire, В той теме есть все необходимые ответы, просто нужно немного технической подкованности.
Если ты конвертнешь свой триггер в текст то увидишь следующую функцию регистрации события TriggerRegisterEnterRectSimple(gg_trg_EnterRegion1,gg_rct_CastRegion1) , которая является бж-функцией (кастом функцией написанной близами) и на самом деле она выглядит так:
function TriggerRegisterEnterRectSimple takes trigger trig, rect r returns event
local region rectRegion = CreateRegion()
call RegionAddRect(rectRegion, r)
return TriggerRegisterEnterRegion(trig, rectRegion, null)
endfunction
То есть функция конвертирует rect gg_rct_CastRegion1 в локально созданный регион и вешает на этот регион событие входа, таким образом твой изначальный рект никак не связан с самим триггером, а регион оказывается потерянным, так как на него не сохранятся ссылок (да и функции GetTriggerRegion() не существует все равно).
В твоем случае, для проигрывания нужной анимации будет достаточно проверить лежит ли координата вошедшего юнита внутри каждого из изначальных ректов:
local real x = GetUnitX(GetTriggerUnit())
local real y = GetUnitY(GetTriggerUnit())
if RectContainsCoords(gg_rct_CastRegion1,x,y) then
// bla bla
elseif RectContainsCoords(gg_rct_CastRegion2,x,y) then
// bla bla bla
elseif ...
Стоит отметить что плодить много elseif-ов это моветон.
И в сразу советую называть "Регионы" которые ты создаешь в редакторе Rect-ами, которыми они являются на самом деле.
nazarpunk, самолёты падают, а машины бьются, теперь не ездить на них и не летать? Если шанс фатала 0,0000...., то это погрешность на которую смело можно класть болт, смело. Тем более мы даже не знаем какая там по времени сессия, там дел может быть на пол часа, час, что еще больше уменьшает вероятность фатала.
Самолёты падают по абсолютно независящим или неизвестным для инженеров проектировщиков причинам, а тут ты предлагаешь пассажирам билеты в заведомо поломанный транспорт.
Если уж без дурацких сравнений, один фатал и человек уже не вернется в твою карту и будет рассказывать друзьям, что она поломанная.
Книжки не удаляются - это давно известный факт, там багованые модельки. Обычные предметы прекрасно удаляются. Только что проверил в рефе создав и удалив 10к предметов.
не заметил, что тебе нужно процентное значение именно владельца ауры, а не юнита который получает ауру. Тогда все еще проще и в целом даже лучше сделать как предложил удав.
Не до конца понимаю манипуляции с группами. Можно на примере показать?
Открыть
function callback takes nothing returns nothing
...
local group auraGroup = LoadGroupHandle(...) // группа с юнитами на которых действует аура
local group tempGroup = CreateGroup()
...
call GroupEnumUnitsInRange(tempGroup,....) // собираем юнитов на которых должна действовать аура
loop // Перебираем старую группу
set i = BlzGroupGetSize(auraGroup) - 1
exitwhen i < 0
set tempUnit = BlzGroupUnitAt(auraGroup,i)
set oldBonus = GetSavedBonus(tempUnit)
if not IsUnitInGroup(tempUnit,tempGroup) then // юнит вне зоны действия ауры
call AddStatBonus(tempUnit,-oldBonus)
call GroupRemoveUnit(auraGroup,tempUnit)
call SaveStatBonus(tempUnit,0)
else
set newBonus = CalcNewBonus(tempUnit) // Просчитываем новый бонус
if newBonus != oldBonus then
call AddStatBonus(tempUnit,newBonus - oldBonus)
call SaveStatBonus(tempUnit,newBonus)
endif
call GroupRemoveUnit(tempGroup,tempUnit) // удаляем из временной группы, что бы не проходтся по нему дважды
endif
set i = i - 1
endloop
loop // перебираем юнитов вокруг владельца ауры, ищем на кого надо добавить эффект ауры
set tempUnit = FirstOfGroup(tempGroup)
exitwhen tempUnit == null
if UnitCanHaveAura(tempUnit) then
set newBonus = CalcNewBonus(tempUnit)
call AddStatBonus(tempUnit,newBonus)
call SaveStatBonus(tempUnit,newBonus)
call GroupAddUnit(auraGroup,tempUnit)
endif
call GroupRemoveUnit(tempGroup,tempUnit)
endloop
call DestroyGroup(tempGroup)
...
auraGroup нужно создать и сохранить при инициализации таймера.
Хотелось бы понять принцип, по которому можно делать подобные способности
Такая аура будет полностью кастомной, стандартная будет использоваться только в качестве болванки.
При изучении ауры/появлении юнита с аурой создаем таймер(период на твое усмотрение)
Коллбек таймера:
группирует и фильтрует юнитов которые должны получать бонус ауры.
просчитывает необходимый бонус для каждого юнита, сохраняет значение и выдает его юниту
запоминает группу юнитов которым был выдан бонус.
При последующих коллбеках
Группируем и фильтруем юнитов.
сравниваем юнитов из ранее сохраненной группы и текущей:
Если юнит в старой группе но не в новой - удаляем бонус, значение которого было сохранено для юнита.
если юнит в обеих группах - просчитываем необходимый бонус, и сравниваем с сохраненным, если они разные меняем значение бонуса.
если юнит только в новой группе - просчитываем бонус , сохраняем, выдаем.
сохраняем новую группу.
Принцип примерно такой, если тебе нужно мгновенное изменение бонуса при поднятии предметов или еще чего либо нужны хуки на нужные события, либо маленький период таймера ауры.
Юнит с 99% поглощения выдержит вдвое большее количество ударов, чем юнит с 9998%поглощения.
Опечатка.
На самом деле рост эффективности брони для выживаемости идёт линейно, и прибавляет по 6% на каждую единицу брони. Чтобы убедиться в этом - добавим новый столбец и преобразуем поглощение в рост выживаемости.
На картинке +0.6 (60%), а не +0.06 (6%)
Оружие 2d4 vs волк (10 hp)
Таблички с волком нет.
Оружие 8d4 vs демон (100 hp)
Последний пример на сегодня. Оружие c уроном 8d4 (8 дайсов по 4 грани у каждой) против противника с 100 ед. здоровья. Этот пример показывает, что несмотря на большое количество вариантов развития событий, всё-равно в конечном итоге с вероятностью в 99.5% медведьдемон будет уничтожен либо 5, либо с 6 удара.
По сути, статья не плохая, но как указали выше, кейсов нет, а просто примитивные примеры. Очевидно не хватает глубины, да и "проектирования математической модели" нет, и самой математики маловато(почти нет). Хотелось бы более структурированной подачи и выделения важных аспектов. К примеру сравнительную таблицу линейного и нормального распределения разброса урона для одинакового противника.
Cancel, я привел конкретный пример, что дебафф на замедление намного эффективнее в играх с маленьким ттк
По поводу примера с замедлением, это еще как сравнивать. К примеру в ртс с ттк 20 сек, замедление на 5 секунд будет составлять 1/4 ттк, при ттк 2 сек, пропорциональным будет замедление на 0.5 сек, кпд которого может быть отрицательным с точки зрения затраты когнитивного и механического ресурса игрока. В пошаговых Героях 3 никто не станет кидать замедление в Архов, которых можно убить с имплы. Но я не геймдев, а простой песант.
Preload все ещё актуален для новой версий Reforged?
Да, он прекрасно позволяет записывать во внешний файл который сохраняется в Documents\Warcraft III\CustomMapData в формате .pld (PreLoadData ?) и так же считывать в игре прелоад эксплойтом. Codeless Save and Load (Multiplayer)
Я что-то позабыл, никто не делал общение игры с внешним сервером через файл? Мб приложения по сбору статистики? я за киберспорт не шарю.
Такого не встречал. В киберспорте есть w3champions.com
По сути думаю что идея реализуема, но никто не станет скачивать и постоянно запускать стороннее приложение, просто ради того, что бы ты собирал статистику. А накопление опыта персонажей, рейтинг игроков и прочее можно реализовать стандартными средствами. За криптостойкость не спрашивай.
Направленные способности в варкрафте кастуются лицом к цели. Что бы кастовать спиной/без поворота, как торрент Кунки, нужен костыль:
Создаем спел на основе канала с типом цени "Юнит или Точка" -> Отлавливаем приказ(!) способности -> Запоминаем юнита-цель, приказываем остановится кастеру -> Приказываем кастеру выстрелить способностью перед собой -> При выполнении способности применяем ее на сохраненного юнита.
В самой способности поворачиваем нашего всадника на нужный угол:
rsfghd, в вопросе буквально нет ни слова, ни намека на многоугольники, четко и ясно написано Области(которые являются прямоугольниками). Если в варике понадобилось использовать многоугольники, то что-то в дизайне пошло явно не так.
В комментах написано, что бы автор вопроса мог проще добавить другие забаненные зоны. Такой код легче читается и редактируется новичками. Можно еще сократить, и не использовать координаты, а сразу создавать и двигать локацаю, это еще сократит код еще на две строки, но зачем?
Если площадь области спавна слишком мала, по отношению к забанненым областям, может оборваться поток. Но при штатом пользовании должно работать нормально.
Код
function GetSpawnPoint takes rect spawnRect returns location
local real x
local real y
local boolean pass
loop
set pass = true
set x = GetRandomReal(GetRectMinX(spawnRect),GetRectMaxX(spawnRect))
set y = GetRandomReal(GetRectMinY(spawnRect),GetRectMaxY(spawnRect))
if RectContainsCoords(gg_rct_rectC,x,y) then // проверяем лежит ли случайная точка в запрещенной области
set pass = false
endif
/*
if RectContainsCoords(gg_rct_rectD,x,y) then // можно добавить несколько забаненых областей
set pass = false
endif
*/
exitwhen pass
endloop
return Location(x,y) // незабываем удалять локацию после использвания
endfunction
..
local location loc = GetSpawnPoint(gg_rct_rectB)
call CreateUnitAtLoc(p,id,loc,GetRandomReal(0.,360))
call RemoveLocation(loc)
set loc = null
..
На основе варглейва стандартной модели демон хантера(он более округлый, чем у модели Иллидана) сделать анимированный снаряд для спела. К модели желательно прикрутить свечение или блеск, что бы он слегка выделялся на общем фоне.
Анимация Stand длительностью 0.7 сек глейв делает полный оборот вокруг оси вращения и возвращается в исходное положение. Ось проходит через (0;0) по XY на высоте примерно 50 и параллельна оси X или Y, так что бы во время полного оборота глейв не касался земли. Анимация Death - глейв из стартового положения пролетает немного вперед и втыкается в землю, через секунду-полторы пропадает.
Сроков особо нет, но не думаю что работка особо пыльная. Или тыкните меня носом если такая модель уже есть (мой поверхностный поиск плодов не принес)
Осторожно Paint
SсRealm, объекты удаляют(область тоже объект в данном контексте), что бы они не занимали место в памяти, если они больше не нужны. Это нужно когда создается относительно большое количество временных объектов. Это относится к точкам(Location), таймерам, областям и тд. Если ты не понимаешь зачем, что либо удалять, то вероятнее всего тебе удалять ничего не стоит, что бы не удалить чего лишнего.
И еще раз повторю то, что сказали все до меня. Твой триггер регистрирует событие входа в Region, Region в свою очередь создается под капотом Гуи из области, удаляя область ты не удаляешь регион, а значит никак не влияешь на триггер.
» WarCraft 3 / Помогите с Rect / Region
» WarCraft 3 / Помогите с Rect / Region
В той теме есть все необходимые ответы, просто нужно немного технической подкованности.
Если ты конвертнешь свой триггер в текст то увидишь следующую функцию регистрации события TriggerRegisterEnterRectSimple(gg_trg_EnterRegion1,gg_rct_CastRegion1) , которая является бж-функцией (кастом функцией написанной близами) и на самом деле она выглядит так:
В твоем случае, для проигрывания нужной анимации будет достаточно проверить лежит ли координата вошедшего юнита внутри каждого из изначальных ректов:
И в сразу советую называть "Регионы" которые ты создаешь в редакторе Rect-ами, которыми они являются на самом деле.
» WarCraft 3 / Как быстро подключать собственные функции в GUI? (желательно модульно)
» WarCraft 3 / Пассивные способности через сферы
Если уж без дурацких сравнений, один фатал и человек уже не вернется в твою карту и будет рассказывать друзьям, что она поломанная.
» WarCraft 3 / Функция RemoveItem() не удаляет предмет
Ред. Zeix
» WarCraft 3 / Аура дающая бонус от статов героя
Ред. Zeix
» WarCraft 3 / Аура дающая бонус от статов героя
» WarCraft 3 / Аура дающая бонус от статов героя
Ред. Zeix
» Game Dev / Как спроектировать игровую математическую модель, забалансить её и не сдуреть. Разбор на практических кейсах
» Game Dev / Как спроектировать игровую математическую модель, забалансить её и не сдуреть. Разбор на практических кейсах
» WarCraft 3 / Юниты стоят на месте. Что делать?
» PAID RIPPED MODELS / Boss Eling Wang
» WarCraft 3 / Клиент-серверное приложение на основе Preload
По сути думаю что идея реализуема, но никто не станет скачивать и постоянно запускать стороннее приложение, просто ради того, что бы ты собирал статистику. А накопление опыта персонажей, рейтинг игроков и прочее можно реализовать стандартными средствами. За криптостойкость не спрашивай.
» WarCraft 3 / Как узнать есть ли цель способности за кастующим юнитом
Создаем спел на основе канала с типом цени "Юнит или Точка" -> Отлавливаем приказ(!) способности -> Запоминаем юнита-цель, приказываем остановится кастеру -> Приказываем кастеру выстрелить способностью перед собой -> При выполнении способности применяем ее на сохраненного юнита.
В самой способности поворачиваем нашего всадника на нужный угол:
» WarCraft 3 / Конкатенация переменной и строки vjass, для получения нового имени переменной
» WarCraft 3 / Спавн в зоне, исключая внутреннюю зону.
» WarCraft 3 / Спавн в зоне, исключая внутреннюю зону.
Ред. Zeix
» WarCraft 3 / Спавн в зоне, исключая внутреннюю зону.
Ред. Zeix
» WarCraft 3 / Нужна модель? - Вам сюда!
Ред. Zeix
» WarCraft 3 / Нужна модель? - Вам сюда!
Осторожно Paint
» WarCraft 3 / Вопрос про Endloop
Ред. Zeix
» WarCraft 3 / Удаление области
И еще раз повторю то, что сказали все до меня. Твой триггер регистрирует событие входа в Region, Region в свою очередь создается под капотом Гуи из области, удаляя область ты не удаляешь регион, а значит никак не влияешь на триггер.
Ред. Zeix
» WarCraft 3 / Как узнать будущее на карте? World Editor.