7

» WarCraft 3 / Помогите с Rect / Region

Принятый ответ
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-ами, которыми они являются на самом деле.
7

» WarCraft 3 / Как быстро подключать собственные функции в GUI? (желательно модульно)

Научить его пользоваться CustomScript, если он даже на это не способен, боюсь от него будет больше вреда чем пользы.
7

» WarCraft 3 / Пассивные способности через сферы

nazarpunk, самолёты падают, а машины бьются, теперь не ездить на них и не летать? Если шанс фатала 0,0000...., то это погрешность на которую смело можно класть болт, смело. Тем более мы даже не знаем какая там по времени сессия, там дел может быть на пол часа, час, что еще больше уменьшает вероятность фатала.
Самолёты падают по абсолютно независящим или неизвестным для инженеров проектировщиков причинам, а тут ты предлагаешь пассажирам билеты в заведомо поломанный транспорт.
Если уж без дурацких сравнений, один фатал и человек уже не вернется в твою карту и будет рассказывать друзьям, что она поломанная.
7

» WarCraft 3 / Функция RemoveItem() не удаляет предмет

Книжки не удаляются - это давно известный факт, там багованые модельки. Обычные предметы прекрасно удаляются. Только что проверил в рефе создав и удалив 10к предметов.
7

» WarCraft 3 / Аура дающая бонус от статов героя

не заметил, что тебе нужно процентное значение именно владельца ауры, а не юнита который получает ауру. Тогда все еще проще и в целом даже лучше сделать как предложил удав.
7

» WarCraft 3 / Аура дающая бонус от статов героя

Не до конца понимаю манипуляции с группами. Можно на примере показать?
Открыть
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 нужно создать и сохранить при инициализации таймера.
7

» WarCraft 3 / Аура дающая бонус от статов героя

Хотелось бы понять принцип, по которому можно делать подобные способности
Такая аура будет полностью кастомной, стандартная будет использоваться только в качестве болванки.
  1. При изучении ауры/появлении юнита с аурой создаем таймер(период на твое усмотрение)
  2. Коллбек таймера:
  • группирует и фильтрует юнитов которые должны получать бонус ауры.
  • просчитывает необходимый бонус для каждого юнита, сохраняет значение и выдает его юниту
  • запоминает группу юнитов которым был выдан бонус.
  1. При последующих коллбеках
  • Группируем и фильтруем юнитов.
  • сравниваем юнитов из ранее сохраненной группы и текущей:
    1. Если юнит в старой группе но не в новой - удаляем бонус, значение которого было сохранено для юнита.
    2. если юнит в обеих группах - просчитываем необходимый бонус, и сравниваем с сохраненным, если они разные меняем значение бонуса.
    3. если юнит только в новой группе - просчитываем бонус , сохраняем, выдаем.
  • сохраняем новую группу.
Принцип примерно такой, если тебе нужно мгновенное изменение бонуса при поднятии предметов или еще чего либо нужны хуки на нужные события, либо маленький период таймера ауры.
7

» Game Dev / Как спроектировать игровую математическую модель, забалансить её и не сдуреть. Разбор на практических кейсах

Дочитал, осилил.
Юнит с 99% поглощения выдержит вдвое большее количество ударов, чем юнит с 99 98%поглощения.
Опечатка.
На самом деле рост эффективности брони для выживаемости идёт линейно, и прибавляет по 6% на каждую единицу брони. Чтобы убедиться в этом - добавим новый столбец и преобразуем поглощение в рост выживаемости.
На картинке +0.6 (60%), а не +0.06 (6%)
Оружие 2d4 vs волк (10 hp)
Таблички с волком нет.
Оружие 8d4 vs демон (100 hp)
Последний пример на сегодня. Оружие c уроном 8d4 (8 дайсов по 4 грани у каждой) против противника с 100 ед. здоровья. Этот пример показывает, что несмотря на большое количество вариантов развития событий, всё-равно в конечном итоге с вероятностью в 99.5% медведь демон будет уничтожен либо 5, либо с 6 удара.
По сути, статья не плохая, но как указали выше, кейсов нет, а просто примитивные примеры. Очевидно не хватает глубины, да и "проектирования математической модели" нет, и самой математики маловато(почти нет). Хотелось бы более структурированной подачи и выделения важных аспектов. К примеру сравнительную таблицу линейного и нормального распределения разброса урона для одинакового противника.
7

» Game Dev / Как спроектировать игровую математическую модель, забалансить её и не сдуреть. Разбор на практических кейсах

Cancel, я привел конкретный пример, что дебафф на замедление намного эффективнее в играх с маленьким ттк
По поводу примера с замедлением, это еще как сравнивать. К примеру в ртс с ттк 20 сек, замедление на 5 секунд будет составлять 1/4 ттк, при ттк 2 сек, пропорциональным будет замедление на 0.5 сек, кпд которого может быть отрицательным с точки зрения затраты когнитивного и механического ресурса игрока. В пошаговых Героях 3 никто не станет кидать замедление в Архов, которых можно убить с имплы. Но я не геймдев, а простой песант.
7

» WarCraft 3 / Юниты стоят на месте. Что делать?

Можно ли это как-то пофиксить?
Да.
уменьшать нагрузку и делать вдвое меньше респаунившихся юнитов
Варкрафт это не Тотал вар, пнятненько.
7

» WarCraft 3 / Клиент-серверное приложение на основе Preload

Принятый ответ
Не могу сказать, что я хорошо шарю в теме.
Preload все ещё актуален для новой версий Reforged?
Да, он прекрасно позволяет записывать во внешний файл который сохраняется в Documents\Warcraft III\CustomMapData в формате .pld (PreLoadData ?) и так же считывать в игре прелоад эксплойтом. Codeless Save and Load (Multiplayer)
Я что-то позабыл, никто не делал общение игры с внешним сервером через файл? Мб приложения по сбору статистики? я за киберспорт не шарю.
Такого не встречал. В киберспорте есть w3champions.com
По сути думаю что идея реализуема, но никто не станет скачивать и постоянно запускать стороннее приложение, просто ради того, что бы ты собирал статистику. А накопление опыта персонажей, рейтинг игроков и прочее можно реализовать стандартными средствами. За криптостойкость не спрашивай.
7

» WarCraft 3 / Как узнать есть ли цель способности за кастующим юнитом

Принятый ответ
Направленные способности в варкрафте кастуются лицом к цели. Что бы кастовать спиной/без поворота, как торрент Кунки, нужен костыль:
Создаем спел на основе канала с типом цени "Юнит или Точка" -> Отлавливаем приказ(!) способности -> Запоминаем юнита-цель, приказываем остановится кастеру -> Приказываем кастеру выстрелить способностью перед собой -> При выполнении способности применяем ее на сохраненного юнита.
В самой способности поворачиваем нашего всадника на нужный угол:
call SetUnitFacing(caster,(Atan2(GetUnitY(target) - GetUnitY(caster), GetUnitX(target) - GetUnitY(caster))+bj_PI)*BJ_RADTODEG)
Если самому невмоготу, можешь оставить заказ в Заклинаниях на заказ
7

» WarCraft 3 / Спавн в зоне, исключая внутреннюю зону.

rsfghd, в вопросе буквально нет ни слова, ни намека на многоугольники, четко и ясно написано Области(которые являются прямоугольниками). Если в варике понадобилось использовать многоугольники, то что-то в дизайне пошло явно не так.
7

» WarCraft 3 / Спавн в зоне, исключая внутреннюю зону.

В комментах написано, что бы автор вопроса мог проще добавить другие забаненные зоны. Такой код легче читается и редактируется новичками. Можно еще сократить, и не использовать координаты, а сразу создавать и двигать локацаю, это еще сократит код еще на две строки, но зачем?
7

» WarCraft 3 / Спавн в зоне, исключая внутреннюю зону.

Если площадь области спавна слишком мала, по отношению к забанненым областям, может оборваться поток. Но при штатом пользовании должно работать нормально.
Код

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 
..
7

» WarCraft 3 / Нужна модель? - Вам сюда!

Охрана отмена, нашел подходящую модель снаряд, правда вращается вокруг оси Z.
7

» WarCraft 3 / Нужна модель? - Вам сюда!

Заказ на работу
  1. Варглейв-снаряд.
  2. На основе варглейва стандартной модели демон хантера(он более округлый, чем у модели Иллидана) сделать анимированный снаряд для спела. К модели желательно прикрутить свечение или блеск, что бы он слегка выделялся на общем фоне.
  3. Анимация Stand длительностью 0.7 сек глейв делает полный оборот вокруг оси вращения и возвращается в исходное положение. Ось проходит через (0;0) по XY на высоте примерно 50 и параллельна оси X или Y, так что бы во время полного оборота глейв не касался земли. Анимация Death - глейв из стартового положения пролетает немного вперед и втыкается в землю, через секунду-полторы пропадает.
Сроков особо нет, но не думаю что работка особо пыльная. Или тыкните меня носом если такая модель уже есть (мой поверхностный поиск плодов не принес)
Осторожно Paint
Загруженные файлы
7

» WarCraft 3 / Вопрос про Endloop

Makeba, я тебе написал, в чём идея использования 0.01 вместо нуля. Я бы вообще отказался от реалов и решал рандом на integer с нужной мне точностью.
А в чем проблема GetRandomReal ? Кривое распределение или что? Есть где инфу почитать ?
7

» WarCraft 3 / Удаление области

SсRealm, объекты удаляют(область тоже объект в данном контексте), что бы они не занимали место в памяти, если они больше не нужны. Это нужно когда создается относительно большое количество временных объектов. Это относится к точкам(Location), таймерам, областям и тд. Если ты не понимаешь зачем, что либо удалять, то вероятнее всего тебе удалять ничего не стоит, что бы не удалить чего лишнего.
И еще раз повторю то, что сказали все до меня. Твой триггер регистрирует событие входа в Region, Region в свою очередь создается под капотом Гуи из области, удаляя область ты не удаляешь регион, а значит никак не влияешь на триггер.