30

» WarCraft 3 / Проходимость юнитов

Turn collision off
Полностью выключает проверки проходимости, однако не выключает дефолтный поиск пути. Грубо говоря, чтобы пройти сквозь здание, надо сначала отдать юниту приказ переместиться в позицию здания и только потом куда-нибудь ещё.
30

» WarCraft 3 / Респавн для геров, вызванных в Таверне.

Ikobot, и если за время ожидания умрёт ещё пара юнитов, то воскресится последний.
30

» RenderEdge / [RenderEdge] Widescreen Fix

Всё хочу спросить: существует ли более-менее полно сформулированная цель проекта, или же он выступает в качестве платформы для проверки тех или иных знаний на практике и может длиться условно бесконечно?
30

» WarCraft 3 / Как в TcX у разрушаемых объектов реализован collision box?

TCX же открыт
Если не найдётся ответа, то само собой, придётся открывать и искать этот момент. Не очень хотелось бы этим заниматься, так как манера написания кода в TcX, так скажем, довольно своеобразна, по крайней мере, на мой взгляд.
Поэтому надеюсь, что кто-нибудь разбирался в этом моменте или продумывал аналогичный алгоритм, который хорошо себя показал.

имхо
"Личное скромное мнение" - не очень точная мера производительности, кмк.

там же реализация собственного движения юнитов и снарядов
Я полагаю очевидным, что подобный вопрос мог возникнуть только при реализации "собственного движения снарядов".
30

» WarCraft 3 / Текстовый ХП-бар

Принятый ответ
Где-то я видел наработку с этими хр барами.
Найдётся в ресурсах пользователя JesusHipster.
30

» StarCraft 2 / Damage unit (from unit)

Я давно не открывал редактор ск2, но, ЕМНИП, там в датаэдиторе можно запилить пассивку, которая будет спавнить для юнита невидимую невыделяемую сущность, которая будет жить как минимум столько же, сколько длится эффект способности, и будет возвращать юнита при обращении. Технически, это будет "труп" юнита, и тот не исчезнет, пока есть эта сущность.
30

» WarCraft 3 / Прошу просто назвать причины фатала

определенное
Экспериментально? Если так считать, то да, определённо определено. Тобой, но, к сожалению, не стандартом. Ощути разницу подходов практическую и буквально на себе, если считаешь этого недостаточным: любая моя карта (да, не дота, но всё-таки) запускается на любой версии варкрафта, а ты после выхода БАГФИКСА вынужден был решать внутреннюю проблему, отвечая на вопрос "должен ли я соответствовать платформе, поскольку мой продукт от неё полностью зависим, или же это платформа должна неожиданно прогнуться под меня?", в итоге выбрав неверный ответ. Ничего лично против тебя не имею, ты близок мне по духу, много знаешь и умеешь, но объективно, это было глупое решение так увлекаться игрушкой, про которую ты точно знал, что её могут отобрать.
Извини, если обидел. С радостью обсудил бы этот момент подробнее в нормальном чате, дабы не разводить здесь оффтоп ЕЩЁ сильнее. Скинь в лс вк или телеграм, если интересно.
30

» WarCraft 3 / Прошу просто назвать причины фатала

когда он таковым не является
На мой взгляд, использование в качестве опорного элемента подсистемы (в данном случае карты) любого поведения, которое авторами исполняющей системы (в данном случае варкрафта) явно воспринимается как "неопределённое" или "нежелательное" есть костылирование; свою точку зрения не навязываю, но проясняю.

использовать чтение и запись в большинстве случаев крайне просто
Безусловно, да, когда это поведение описано и гарантировано стандартом языка. В варкрафте же оно является побочным, а сама его реализация в сравнении со стандартным подходом того же Си - контринтуитивной. Ну серьёзно, это же по сути инъекция байткода

Обычно юнит умирает с 0.405 хп
Юнит никогда не будет иметь 0.405 хп, если ты их не выдашь ему кодом непосредственно перед проверкой.
30

» WarCraft 3 / Прошу просто назвать причины фатала

для людей
используются только мной

Себя я считаю человеком, и пишу тоже для себя ;-)

Собственно, ты умеешь и абстрагируешься от своих костылей, тут вопросов нет, но учить так делать неофитов - неверный подход. Они, не обладая твоей полнотой знаний и навыков, почти гарантированно начнут стрелять себе в колени, и с хорошими шансами никогда не смогут найти, чем именно.
30

» WarCraft 3 / Hashtable

DracoL1ch, уберсплат - тоже объект, пусть и лёгкий. Течь же по-разному может, где ссылка, а где и сам экземпляр.
30

» WarCraft 3 / Как передать параметр в ForGroupBJ?

GetUnitsInRangeOfLocAll(200.00, GetUnitLoc(UntVarA1))
Что мешает заранее создать эту группу, поместив в переменную и использовать её?

Вообще, можно избавиться от фактического использования группы, поместив в представленную boolexpr функцию все проверки и действия, а возвращать всегда false, как в этом примере, где наносится урон в радиусе от точки:
		globals {
			boolexpr filter
			unit tempUnit // Дополнительные данные можно передавать через временные глобалки, в варкрафте это оправдано, но при параллельных потоках где-нибудь ещё неприменно выстрелит в ногу.
			group fictiveGroup = CreateGroup()
		}

        bool cond() {
			// По факту, вся эта функция вызывается через boolexpr, который из неё создан.
            unit u = GetEnumUnit()
            float amount // Сюда в этом примере кладётся урон, рассчитываемый тем или иным образом.
            if !IsUnitAlly(u, GetOwningPlayer(tempUnit)) {
                UnitDamageTarget(tempUnit, u, amount, false, false, ConvertAttackType(5), ConvertDamageType(0), ConvertWeaponType(0)) 
            }
            return false;
        }

        void dealDamageFromCoords(float x, float y, float radius, unit source) {
            tempUnit = source
			// Стоит использовать координаты, а не локации, GetUnitX/Y в помощь.
            GroupEnumUnitsInRange(fictiveGroup, x, y, radius, filter)
        }

        static void initFilter() {
			// Эта функция вызывается одножды после старта игры и забывается.
            filter = Condition(function cond)
        }
30

» WarCraft 3 / Прошу просто назвать причины фатала

Если совсем по-тупому, то могу предложить создать глобальную группу "все юниты на карте", добавлять туда всех новых юнитов (кроме системных) и по событию смерти удалять из группы, тогда твоя проверка "живости" юнита будет заключаться в проверке нахождения в этой группе, и подобная бага не сможет появиться.

Но это очевидный костыль, хотя и красивый.
30

» WarCraft 3 / Прошу просто назвать причины фатала

БД на броню в 2017 и во времена мемхака...
"Портируемость" явно не входит в список знакомых тебе понятий. Советую проникнуться ею достаточно глубоко, чтобы не использовать тот или иной недокументированный функционал (это вообще, не только про вц), так как он имеет свойство переставать существовать после багфиксов.

Про "дополнительные" проверки:
//===========================================================================
function IsUnitDeadBJ takes unit whichUnit returns boolean
    return GetUnitState(whichUnit, UNIT_STATE_LIFE) <= 0
endfunction

//===========================================================================
function IsUnitAliveBJ takes unit whichUnit returns boolean
    return not IsUnitDeadBJ(whichUnit)
endfunction

Ну ты понял. =)
30

» WarCraft 3 / Прошу просто назвать причины фатала


Какого панциря
Сначала все возможные проверки, потом все зависящие от них действия, не наоборот. Кстати:
call UnitAddAbility(u5,'A28W')
call SetPlayerAbilityAvailableBJ( false, 'A28W', GetOwningPlayer(u5) )
call UnitMakeAbilityPermanent(u5,true,'A28W')
call UnitMakeAbilityPermanent(u5,true,'A28X')
call SetUnitAbilityLevelSwapped('A28X',u5,R2I(number))
Весь этот мусор можно вынести в отдельную функцию, намного проще будет дебажить.
И научись, пожалуйста, пользоваться таким построением при постинге:
((код
// тут код
))
30

» WarCraft 3 / Прошу просто назвать причины фатала

проверка даже излишне осторожная немножко
Прямо поэзия в этих строках есть какая-то. А вообще, "излишне" и "немножко" это взаимоисключающие понятия.
IsUnitAliveBJ(u5) == true and GetUnitState(u5,UNIT_STATE_LIFE)>1 and IsUnitDeadBJ(u5) == false
Три абсолютно идентичные по сути проверки (слегка разные по быстродействию), достаточно одной.

Может, ещё гетюнитармор не надо в начале считать при объявлении переменных? Она не мемхачная, а старая с хайва и там селфдамаг... может, там если юнита вдруг оказалось, что нет, получается ноль и из-за этого трындец где-то дальше... попробую мб заменить на мемхачную
30

» WarCraft 3 / Hashtable

Принятый ответ
Говоря прямо о вопросе треда, замечу, что FlushChildHashtable стоит применять перед сохранением данных в хэш-таблицу при условии, что в конкретной ячейке таблицы гипотетически что-то может находиться (i.e. данные в неё кладутся БЕЗ использования GetHandleId).

бояться утечек нечего
Просто в качестве примера: я где-то встречал огромную систему динамического изменения текстур террейна посредством уберсплатов, которая при определённых условиях с достаточно большой скоростью выпиливала старые и создавала новые; в этой системе уберсплаты не утекали, но, случись такое, выделенные 2 гига оперативы кончились бы относительно быстро.
30

» WarCraft 3 / Hashtable

ScopteRectuS, как твой ответ (вернее, ответ DracoL1ch) входит в хоть какую-нибудь конфронтацию с тем, что я описал в сообщении выше? В чём была цель подобного цитирования, если оно не привнесло в тред вообще ничего конструктивного, являясь уточнением уже описанного конструктива?

DracoL1ch, емнип, с тексттагами можно было где-то накосячить и таки лишиться активных ссылок на уже существующие (глобально или локально - не так важно) тексттаги без указанного лайфспана => концептуально они утечны, и практически это зависит исключительно от использования.
30

» WarCraft 3 / Hashtable

ScopteRectuS, нельзя создавать локально экземпляры тех объектов, состояние которых так или иначе подлежит синхронизации между игроками (при этом у синхронизируемых объектов зачастую есть несинхронизируемые характеристики состояния).
Тем не менее, возможность создавать что-то локально без приведения к десинхронизации никак не говорит о том, что такие объекты не могут вызывать т.н. "утечек".

Относительно texttag стоит заметить, что это не текст, а расположеный в игровом пространстве объект, этот текст выводящий. Сам текст, являющийся string чистить бессмысленно, за деталями - в статьи на сайте (с учётом реализации таблицы строк в JASS) или в википедии (для более общих или иных частных случаев).

Да и в целом советую почитать про то, что такое хеш-таблица.
30

» WarCraft 3 / Вопрос от человека, который не разбирается в создании карт.

Принятый ответ
Изучение и использование любого языка программирования - крайне интересный процесс, и JASS - далеко не самый плохой вариант для того, чтобы быть изученным первым =)
Но если изучать что-либо не хочется, то ищите исполнителя и просите у него определённого результата за соответствующее вознаграждение.
30

» WarCraft 3 / Как перебрать юнитов в отряде?

только не в случае с каким-нибудь "духовным пламенем"
На этот случай существуют приказы выключения автоматического применения.
30

» WarCraft 3 / Наименование функций и переменных

На хайве на основе naming convention, принятого в гугле (по С++) и того, как писали код сами близы признан общим стандартом следующий подход к именованию:
ModuleName
StructName
LibraryName
ScopeName
FunctionName
methodName
variableName		// Любые, использование цифр допускается везде, кроме первого символа.
CONSTANT_NAME		// Использование цифр допускается везде, кроме первого символа.
DEFINED_VALUE		// Кроме перехвата функций.

// Знаки "=", "+" и "-" выделяются с обеих сторон пробелами, "*" и "/" не выделяются.
x = 1 + 1*3 - 6/2*6

// Скобки всегда ставятся максимально близко к содержащемуся в них выражению.
y = num1*((num2 - CONSTANT_1)/num3) + num2/num1

// Отступ при увеличении вложенности - 4 пробела.

// Операторы сравнения выделяются пробелами с обеих сторон.
// Пробелами отделяются "if"/"elseif" и "then" от условия между ними.
// Логические операторы "not", "and" и "or" также обособляются с обеих сторон.
// Каждое условное ветвление размещается на новой строке.
if (num1 == num2) and not (num2 < num3) then
	// ...
elseif (num1 != num2) or (num2 > num3) then
	// ...
else
	// ...
endif
return (num1 == num2) and not (num2 < num3)
30

» WarCraft 3 / Как перебрать юнитов в отряде?

Принятый ответ
  • Выбираешь всех целевых юнитов в группу.
  • Создаёшь дамми.
  • Используя ForGroup и GetEnumUnit, применить на каждого юнита в группе заклинание.
  • Очищаешь групппу.
  • Удаляешь группу.
  • Удаляешь дамми.

У дамми-юнита должны стоять настройки анимации, позволяющие применять способности без задержек, у способности не должно быть кулдауна.