14

» WarCraft 3 / какие свойства есть у абилки 'Aloc' и чем их воспроизвести?

Extremator: Алок делает юнита неуязвимым.
добавлено в шапку
Extremator: Скрыть юнита с мини-карты выставив ему спец.значок
это в WE делается или в джасе тоже можно?
Загруженные файлы
14

» WarCraft 3 / BLP Laboratory (blplab)

а разрабы не додумались на кнопку "Save As" брать изначальный путь картинки?
то есть им норм каждый раз весь путь с нуля писать в пустое поле, да? и папку и новое имя да? это удобно должно быть?
и если проект закрыт и не обновляется - то почему исходники не выложены?
14

» WarCraft 3 / каким софтом можно создать w3r файлы из координат?

quq_CCCP: Зачем?
чтобы были области в WE
quq_CCCP:у тебя есть координаты с ними и работай
а кто-то писал что у меня пропадают координаты из j файла и я с ними не могу работать?
quq_CCCP:создать в карте новый рект и посмотреть его текущие корды и переписать в j файл раз плюнуть.
зачем создавать рект а потом еще и переписывать его координаты которые итак известны до создания этого ректа?
quq_CCCP:раз плюнуть.
а если таких ректов 200 ?
давай я тебе скину карту и список координат, а ты мне вернёшь карту с уже созданными ректами в WE по этому списку
идёт? тебе же это раз плюнуть вроде
а потом ещё пару раз, для карт с другим номером vерсии карты
quq_CCCP: Зачем?
может тогда вообще рисованные области в WE нинужна? зачем их вообще близы добавили в WE ? итак же всё понятно и без них на цифрах
14

» WarCraft 3 / каким софтом можно создать w3r файлы из координат?

nazarpunk: можешь потестить
не видит обфусцированные (или вручную без WE названные) строки с переменными без gg_rct_
в остальном - и не подкопаешься
Загруженные файлы
14

» XGM Team / Онлайн-инструменты для геймдев и моддинг арта

nazarpunk: Как это нет?
имелось ввиду, что в j файле погода идёт отдельными строками, а не в координатных =Rect() строках, которые юзер будет вставлять на сайт:
а цвет вообще хранится только в w3r файле и нигде больше, т.е. восстановить цвет после удаления w3r никак не получится:
    set gg_rct_Rect4 = Rect( 896.0, 1280.0, 1440.0, 1920.0 )
    set we = AddWeatherEffect( gg_rct_Rect4, 'RAhr' )
ScorpioT1000: А можно как это в hex выглядит?
выглядит весьма локанично - красное координаты, зеленое цвет с погодой

nazarpunk: я уже тупой парсер сделал
лучше будет, если ты его таким и оставишь (с правым окном)
потому как я себе тоже делал подобный парсер чисел, чтобы сравнивать изменения координат при смене версий карты
после обфускации кода по названиям переменных уже не сравнить, а остаётся только по конкретным 4-х числовым координатам сравнивать
(т.е. нужда в переводе j-текста в обычные числа тоже есть)
ещё можно второй вид представления добавить вида "Rect1\t1111,0\t2222,0\t3333,0\t4444,0" чтобы список был максимально числовым с табуляцией без лишнего текста
тогда получится два инструмента в одном - и w3r конвертор, и обработчик координат из j файла
Загруженные файлы
14

» WarCraft 3 / каким софтом можно создать w3r файлы из координат?

nazarpunk: можешь потестить
потестил, парсер прекрасный, обрабатывает даже без пробелов и числа без нулей после точки вида:
set gg_rct_Rect001 = Rect(3071.,1536.,3200.,1664.)
если кнопку "скачать" передвинуть направо под список minX minY, то будет интуитивно понятнее, что качаешь что-то обработанное
а если она слева - то как будто качаешь что-то своё, которое сам вставил необработанное
14

» XGM Team / Онлайн-инструменты для геймдев и моддинг арта

nazarpunk: я так понимаю, что ты хочешь из взломанной карты вернуть ректы в WE?
да, исходника карты у меня нету
а нужно это для визуального отображения, потому как w3r влияет только на отображение в WE и не влияет на исполнение j файла (поэтому протекторы и удаляют w3r собственно)
благо в формате =Rect() нет ни погоды, ничего - можно занулить всё и оставить только 4 координаты и имя, и номер порядковый
14

» WarCraft 3 / каким софтом можно создать w3r файлы из координат?

nazarpunk: ниразу не слышал, что кому либо понадобился w3r
это удобно например в сфере депротекта
когда у тебя есть только координаты и ты выбираешь:
  1. либо по ним вручную мышкой рисовать ректы в WE
  2. либо сидеть ковырять хексы ради одной карты
  3. либо забить и как и раньше вписывать координаты в j файл, без отображения областей в WE
кстати гуишников тоже много, и мало кто из них сидит на чём то более продвинутом - значит ли это, что продвинутое нинужна?
14

» XGM Team / Онлайн-инструменты для геймдев и моддинг арта

nazarpunk: Каким образом такой рект интерпретировать:
если будет инструмент-конвертер хотя бы для чистых числовых координат,
то такой рект (или много ректов в цикле) можно автоматом просчитать и вывести через прелоад в текстовик в виде готовых чисел и сразу скормить их на сайт
в WE тоже нельзя задать переменные в координаты ректа, и в w3r чистые цифры, поэтому перевод из букав в цифры ложится на картодела
а легкий способ по переводу я уже указал
14

» XGM Team / Онлайн-инструменты для геймдев и моддинг арта

nazarpunk: Список ректов в каком формате?
в текстовом, в котором они и хранятся в j файлах
14

» XGM Team / Онлайн-инструменты для геймдев и моддинг арта

пожелание на новый инструмент:
вбиваешь из буфера обмена ему список ректов, а он тебе делает w3r для скачивания
    set gg_rct_Rect001 = Rect( 576.0, 832.0, 704.0, 960.0 )
    set gg_rct_Rect002 = Rect( 192.0, 192.0, 448.0, 800.0 )
    set gg_rct_Rect003 = Rect( 544.0, 128.0, 1312.0, 448.0 )
        D  PD  0D  pDRect001          яЂЂя  @C  @C  аC  HDRect002         яЂЂя  D   C  ¤D  аCRect003         яЂЂя
судя по инфе - такого инструмента ещё нигде нету в инете
14

» WarCraft 3 / каким софтом можно создать w3r файлы из координат?

nazarpunk: берёшь любой язык программирования
а зачем усложнять? надо сразу на ASM писать карту, языки для слабых
а по пути удалить WE, JNGP, VSCode, UjAPI, просмотровщики моделей и прочие джас хелперы с блендерами
14

» Game Dev / Шлемы-тыквы - иконки от ИИ

Alan_Gu: Но он меньше всего напоминает тыкву
наверное он ко всем шлемакам ещё и хелоуин примешал
14

» WarCraft 3 / Как можно оптимизировать этот код с 2D коллизиями?

goodlyhero: У вас есть вот такая конструкция: Там юнит не обнуленный.
точно, в тех двух местах он же в середине цикла выходит и не обнуляет перебором до конца
nazarpunk: Или использовать глобалки
вот результаты тестов:
по общему впечатлению карта с глобалками на промежутке 40~50 фпс работает на пару фпс ниже-выше (прыжками туда сюда), сложно отловить, но тренд небольшой есть на обоих проверках
в целом - отличий на высоких фпс практически нет, зато как только фпс начинают падать - так сразу появляется небольшой выйгрыш на 5-10 фпс перед предсмертной агонией, т.е. небольшой выйгрыш таки есть, цена этому - сотня замен по всему коду и при выходе новых версий временнозатратно будет их патчить
goodlyhero: В целом, вместо ренжа 200 вам хватит и 128
перепроверил с радиусом 128, а также выключил -pro режим, который был включен при первом (с радиусом 200) тесте и съедал фпс на себя
итоговые результаты поразительны - количество коллизий уменьшилось в 3 раза, а максимальное количество коробок стало в 2 раза выше
и если в оригинальном виде - было под 80000 просчётов коллизий и максимум 8 объектов (не путать с 1ым графиком, там чуть щадящая система оценки была и можно сдвинуть на 1 влево)
то в enum128 варианте - происходит только 35000 просчетов коллизий, и макс 15 объектов, что уже ощутимо вырывается по отличиям
мало того, эта система еще и гибкая - т.е. в реальных игровых условиях результаты будут еще чуть лучше, потому что многие объекты стоят отдельно на уровне а не в единой цепочке с остальными
с имеющимся кодом и лимитами варика - думаю осталось два путя:
1 - оптимизировать MushroomMoving_RectCondition, там по 3 раза вызывается MushroomMoving_CollisionCheck на каждый чих а не по 1 и есть шанс еще в 3 раза повысить производительность без потери текущей физики
2 - как предложил Daro делать на триггерах вхождения юнитом в регион (на карте подобная система уже присутствует при нырянии в воду)
возможно есть и другие методы, а также те люди, кто в будущем захочет этим заняться и довести максимальное количество объектов до 50, как и задумано в карте с лабораторией - заспавнить 50 коробок
пожалуй заберу метод с радиусом как облегчение игрокам с низкими фпс
тем более что картоделы тоже страдают от этого лимита коробок, поэтому на карте больше 7+6=13 объектов обычно не появляется
вот код с глобалками - xgm.guru/files/100/315886/comments/520383/BoxLab_1.1_EN_global.j
вот код с глобалками + енум - xgm.guru/files/100/315886/comments/520383/BoxLab_1.1_EN_global_e...
вот чистый енум:
код GroupEnumUnitsInRange 128
function UnitIndex takes unit u returns integer
	local integer i=1
	loop
		exitwhen i>PLAYER_MAXINUM+Stage_BoxsCount
		if u==OrangeMushroom[i] then
			set u=null
			return i
		endif
		set i=i+1
	endloop
	set u=null
	return 0
endfunction
function MushroomMoving_CollisionCheck takes integer i,real x,real y returns boolean
	local integer j=1
	local real otherx
	local real othery
	local group G = CreateGroup()
	local unit u=null
	if LevelClearState[i]==false then
		call GroupEnumUnitsInRange(G, x,y, 128, null)
		loop
			set u = FirstOfGroup(G)
			exitwhen u==null
			if MB_Frame_On==1 then
				set MB_CollisionY = MB_CollisionY+1
			endif
			if u!=OrangeMushroom[i] then
				set j=UnitIndex(u)
				set otherx=GetUnitX(OrangeMushroom[j])
				set othery=GetUnitY(OrangeMushroom[j])
				if (GetPlayerSlotState(GetOwningPlayer(OrangeMushroom[j]))==PLAYER_SLOT_STATE_PLAYING or j>PLAYER_MAXINUM) then
					if ContainsCoords(otherx-64,othery-64,otherx+64,othery+64,x,y)==true then
						if PropellyCondition==true then
							if GetUnitTypeId(OrangeMushroom[j])!='orai' then
								set u=null
								call DestroyGroup(G)
								set G=null
								set Frame_MainPlayerY=j
								return false
							endif
						else
							set u=null
							call DestroyGroup(G)
							set G=null
							set Frame_MainPlayerY=j
							return false
						endif
					endif
				endif
			endif
			call GroupRemoveUnit(G, u)
		endloop
		call DestroyGroup(G)
		set G=null
	endif
	return true
endfunction
в варианте с енум чтобы коллизия работала с грибами - надо подредактировать юнитов в WE и убрать там Aloc, а потом в самом j коде второй раз убрать Aloc, но это уже другая история
14

» WarCraft 3 / Как можно оптимизировать этот код с 2D коллизиями?

goodlyhero: 1. У вас есть вторая функция которая делает также: MushroomMoving_Collision
она для движений по X, и совсем не нагружает код, по сравнению с MushroomMoving_CollisionCheck
на скрине она в текущем фрейме просчитывается по X 0 раз, а по Y 111 раз
поэтому с её переделкой я даже не заморачивался
goodlyhero: 2. нужно уничтожать группу через DestroyGroup
хорошее замечание
goodlyhero: 2. и потом обнулять группу и юнита.
я проводил тесты, да и в том цикле есть условие по exitwhen u==null
разве когда берётся юнит из пустой группы - call GroupEnumUnitsInRange(G, x,y, 200, null) - то переменная u не обнуляется?
чем отличается u=null после выборки из пустой группы и ручное set u=null ?
у меня сначала были строки set u=null, но потом я решил что все равно u обнуляется перебором юнитов в группе и такие строки будут излишни
goodlyhero: 4. В этот ренж попадает и сам юнит, Нужно его пропустить, например банальной проверкой
там же стоит именно такая проверка -- if u != OrangeMushroom[i] then
Загруженные файлы
14

» WarCraft 3 / Как можно оптимизировать этот код с 2D коллизиями?

в карте у всех юнитов стоит abiList:
Aloc - москиты locust - что делает юнита некликабельным и не показывает тултип
Avul - неуязвимый invulnerable - что убирает показывание полоски жизни
GroupEnumUnitsInRect и GroupEnumUnitsInRange - не работает с москитами, т.е. юнита с такой абилкой - не добавляет в группу
если убрать Aloc с коробки - то коллизии начинают работать
если убрать Aloc с гриба - то коллизии почему-то не срабатывают когда гриб под коробкой - если коробка сверху, то она проваливается в него, хотя на коробке гриб стоит нормально
после редактирования карты и убирания москитов с коробок такие результаты:
-bridge 12 в новом коде выдает 19200 коллизий против 79200 коллизий в прошлом
варик без пробуксовывания может обрабатывать максимум уже не -bridge 12 а -bridge 18 - 28600 коллизий
-ladder2 10 в новом коде выдает 26300 коллизий против 82000 коллизий в прошлом
варик без пробуксовывания может обрабатывать максимум уже не -ladder2 10 а -ladder2 12 - 32200 коллизий
вот получившийся код через GroupEnumUnitsInRange 200
пока через радиус, с ректом не морочился
код GroupEnumUnitsInRange 200
function UnitIndex takes unit u returns integer
	local integer i=1
	loop
		exitwhen i>PLAYER_MAXINUM+Stage_BoxsCount
		if u==OrangeMushroom[i] then
			set u=null
			return i
		endif
		set i=i+1
	endloop
	set u=null
	return 0
endfunction
function MushroomMoving_CollisionCheck takes integer i,real x,real y returns boolean
	local integer j=1
	local real otherx
	local real othery
	local group G = CreateGroup()
	local unit u=null
	if LevelClearState[i]==false then
		call GroupEnumUnitsInRange(G, x,y, 200, null)
		loop
			set u = FirstOfGroup(G)
			exitwhen u==null
			if MB_Frame_On==1 then
				set MB_CollisionY = MB_CollisionY+1
			endif
			if u!=OrangeMushroom[i] then
				set otherx=GetUnitX(u)
				set othery=GetUnitY(u)
				set j=UnitIndex(u)
				if (GetPlayerSlotState(GetOwningPlayer(OrangeMushroom[j]))==PLAYER_SLOT_STATE_PLAYING or j>PLAYER_MAXINUM) then
					if ContainsCoords(otherx-64,othery-64,otherx+64,othery+64,x,y)==true then
						if PropellyCondition==true then
							if GetUnitTypeId(OrangeMushroom[j])!='orai' then
								set G=null
								set Frame_MainPlayerY=j
								return false
							endif
						else
							set G=null
							set Frame_MainPlayerY=j
							return false
						endif
					endif
				endif
			endif
			call GroupRemoveUnit(G, u)
		endloop
		set G=null
	endif
	return true
endfunction
перехожу к тестам второго способа через глобалки
Загруженные файлы
14

» WarCraft 3 / Как можно оптимизировать этот код с 2D коллизиями?

nazarpunk: А имелось в виду сверять только ближайшие координаты, чтоб хоть как-то понизить сложность.
какой нативкой можно сверять ближайшие координаты у других юнитов рядом с заданным?
nazarpunk: Зачем получать координаты из игры, если стандартная система перемещений отключена? Почему не хранить их в массиве не пользоваться только Set?
прекрасное замечание, завтра попробую пошаманить и перевести координаты на глобалки
goodlyhero: EnumUnitsInRect
благодарю, тоже попробую брать чуть расширенный рект юнита и применять к нему EnumUnitsInRect
благо карта позволяет всё измерить сразу же
14

» WarCraft 3 / Как можно оптимизировать этот код с 2D коллизиями?

goodlyhero: Попробуйте проверять на коллизию не всех юнитов на карте а только ближайших, например через поиск их в ректе.
а разве именно это не делает эта имеющаяся строка в коде?:
if ContainsCoords(otherx-64,othery-64,otherx+64,othery+64,x,y)==true then
более того - если эту проверку убрать и оставить только считывание координат всех юнитов - то скорость особо не изменится, т.к. тормоза идут именно из-за считывания координат, которые потом сравниваются - близко они или далеко
nazarpunk: Что такое CPS?
счётчик количества отработки функции MushroomMoving_CollisionCheck
варик начинают загружать именно эти две строки:
set otherx=GetUnitX(OrangeMushroom[j])
set othery=GetUnitY(OrangeMushroom[j])
а счётчик считает сколько раз было обращение к этим строкам
14

» XGM Team / Онлайн-инструменты для геймдев и моддинг арта

Cancel: Просмотрщик моделей, конвертер изображений - это даже отдалённо не про игровой дизайн
а виндовый блокнот - это уже про геймдизайн или ещё нет?
хотелось бы списочек того - что про геймдизайн
14

» XGM Конкурсы / [Итоги] Большой Турнир Ландшафтеров 2023

nazarpunk: Никто не мешает обголосоваться
так, а где тогда послеконкурсная голосовалка на приз зрительских симпатий?
14

» Мир безумного / Activision Blizzard присоединяется к Microsoft

N7 Molot: ждем что то плохое на близконе:
youtube
щас бы вместо блю-постов смотреть ролики от нанеймов