16

» WarCraft 3 / Visual Studio Code: WarCode

ScorpioT1000: Борьба Nazarpunk против быстрых современных решений
тоже наблюдаю за этим сериалом
16

» WarCraft 3 / как открыть свойства звука? WE

Принятый ответ
использовать как звук - тогда появится справа и там даблклик
Загруженные файлы
16

» Survivor Challenge TD / Релиз в СТИМЕ

soshroom: захватывающая новая Tower Defense игра
то есть одна вышка в центре это захватывающе и ново?
пойду передам это грин цирклю 15-ти летней давности
Загруженные файлы
16

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

host_pi: не показывается такая моделька
обновление:
работает только если закинуть mdx + blp всей кучей разом, причём 1й раз моргнёт и не покажет а если второй раз сразу перетащить всю кучу поверх первой то уже загрузится нормально модель
16

» WarCraft 3 / как выключить(задать) анимацию при добавлении модели на ланд ?

какая полезная картинка
poisoNDealer: Особо это не тестил, но подозреваю
тестанул:
оставил Stand и Stand 3, остальные поменял на токены - при загрузке в WE стали чередоваться только Stand и Stand 3
оставил только Stand, остальные поменял на токены - при загрузке в WE чередование прекратилось
бонусом текст из картинки:
Appendix A - Animation Tokens
Primary Animations
Attack
Birth
Cinematic
Death
Decay
Dissipate
Morph
Portrait
Sleep
Spell
Stand
Walk
Animation Properties
Alternate
Alternateex
Chain
Channel
Complete
Critical
Defend
Drain
Eattree
Fast
Fill
Flail
Flesh
Fifth
Fire
First
Five
Four
Fourth
Gold
Hit
Large
Left
Light
Looping
Lumber
Medium
Moderate
Off
One
Puke
Ready
Right
Second
Severe
Slam
Small
Spiked
Spin
Swim
Talk
Third
Three
Throw
Two
Turn
Victory
Work
Wounded
Upgrade

итого все вопросы решены
Загруженные файлы
16

» WarCraft 3 / как выключить(задать) анимацию при добавлении модели на ланд ?

poisoNDealer: какого результата нужно в итоге добиться?
оставить только одну анимацию при добавлении модельки на карту


в общем вот сводка:
  1. выставил в модели из шапки редкость 1000 на всех ненужных стендах - они перестали сменяться в WE и в игре
  2. переименовал Stand 12345 в Attack 12345 + редкость 0 --- тоже сработало
  3. по какой то причине не сработало переименование стендов в aaaa bbbb cccc dddd
  4. на дефолтных модельках в варике в среднем по 3 стенда и у второстепенных стоит рарити 3 или 4 или 5
остался один вопрос без ответа (да и особо и не нужно)
в этой модели
MDL
//+-----------------------------------------------------------------------------
//| Mushroom.mdl
//| Generated by War3 Model Editor v1.07
//+-----------------------------------------------------------------------------
Version {
	FormatVersion 800,
}
Model "Texture" {
	NumGeosets 1,
	NumBones 1,
	BlendTime 150,
	MinimumExtent { -64, -64, 0.199997 },
	MaximumExtent { 64, 64, 0.200003 },
	BoundsRadius 90.5097,
}
Sequences 8 {
	Anim "Stand First" {
		Interval { 0, 500 },
		MinimumExtent { -64, -64, 0.199997 },
		MaximumExtent { 64, 64, 0.200003 },
		BoundsRadius 90.5097,
	}
	Anim "Walk First" {
		Interval { 501, 951 },
	}
	Anim "Stand ready First" {
		Interval { 1001, 1002 },
		NonLooping,
		MinimumExtent { -64, -64, 0.199997 },
		MaximumExtent { 64, 64, 0.200003 },
		BoundsRadius 90.5097,
	}
	Anim "Spell First" {
		Interval { 1003, 1004 },
		NonLooping,
		MinimumExtent { -64, -64, 0.199997 },
		MaximumExtent { 64, 64, 0.200003 },
		BoundsRadius 90.5097,
	}
	Anim "Stand Second" {
		Interval { 2000, 2500 },
		MinimumExtent { -64, -64, 0.199997 },
		MaximumExtent { 64, 64, 0.200003 },
		BoundsRadius 90.5097,
	}
	Anim "Walk Second" {
		Interval { 2501, 2951 },
	}
	Anim "Stand ready Second" {
		Interval { 3001, 3002 },
		NonLooping,
		MinimumExtent { -64, -64, 0.199997 },
		MaximumExtent { 64, 64, 0.200003 },
		BoundsRadius 90.5097,
	}
	Anim "Spell Second" {
		Interval { 3003, 3004 },
		NonLooping,
		MinimumExtent { -64, -64, 0.199997 },
		MaximumExtent { 64, 64, 0.200003 },
		BoundsRadius 90.5097,
	}
}
Textures 5 {
	Bitmap {
		Image "Mushroom001.blp",
	}
	Bitmap {
		Image "Mushroom002.blp",
	}
	Bitmap {
		Image "Mushroom003.blp",
	}
	Bitmap {
		Image "Mushroom004.blp",
	}
	Bitmap {
		Image "Mushroom005.blp",
	}
}
Materials 1 {
	Material {
		Layer {
			FilterMode Transparent,
			TextureID 14 {
				DontInterp,
				0: 0,
				250: 1,
				501: 2,
				651: 3,
				801: 4,
				1001: 3,
				1003: 4,
				2000: 0,
				2250: 1,
				2501: 2,
				2651: 3,
				2801: 4,
				3001: 3,
				3003: 4,
			}
			TwoSided,
			Unshaded,
			Unfogged,
		}
	}
}
Geoset {
	Vertices 4 {
		{ -64, -64, 0.199997 },
		{ -64, 64, 0.199997 },
		{ 64, -64, 0.200003 },
		{ 64, 64, 0.200003 },
	}
	Normals 4 {
		{ -4.37722e-008, 0, 1 },
		{ -4.37722e-008, 0, 1 },
		{ -4.37722e-008, 0, 1 },
		{ -4.37722e-008, 0, 1 },
	}
	TVertices 4 {
		{ 0, 0 },
		{ 1, 0 },
		{ 0, 1 },
		{ 1, 1 },
	}
	VertexGroup  {
		0,
		0,
		0,
		0,
	}
	Faces 1 6 {
		Triangles {
			{ 0, 2, 3, 0, 3, 1 },
		}
	}
	Groups 1 1 {
		Matrices { 0 },
	}
	MinimumExtent { -64, -64, 0.199997 },
	MaximumExtent { 64, 64, 0.200003 },
	BoundsRadius 181.019,
	Anim {
		MinimumExtent { -64, -64, 0.199997 },
		MaximumExtent { 64, 64, 0.200003 },
		BoundsRadius 181.019,
	}
	Anim {
		MinimumExtent { -64, -64, 0.199997 },
		MaximumExtent { 64, 64, 0.200003 },
		BoundsRadius 181.019,
	}
	Anim {
		MinimumExtent { -64, -64, 0.199997 },
		MaximumExtent { 64, 64, 0.200003 },
		BoundsRadius 181.019,
	}
	Anim {
		MinimumExtent { -64, -64, 0.199997 },
		MaximumExtent { 64, 64, 0.200003 },
		BoundsRadius 181.019,
	}
	Anim {
		MinimumExtent { -64, -64, 0.199997 },
		MaximumExtent { 64, 64, 0.200003 },
		BoundsRadius 181.019,
	}
	Anim {
		MinimumExtent { -64, -64, 0.199997 },
		MaximumExtent { 64, 64, 0.200003 },
		BoundsRadius 181.019,
	}
	Anim {
		MinimumExtent { -64, -64, 0.199997 },
		MaximumExtent { 64, 64, 0.200003 },
		BoundsRadius 181.019,
	}
	Anim {
		MinimumExtent { -64, -64, 0.199997 },
		MaximumExtent { 64, 64, 0.200003 },
		BoundsRadius 181.019,
	}
	Anim {
		MinimumExtent { -64, -64, 0.199997 },
		MaximumExtent { 64, 64, 0.200003 },
		BoundsRadius 181.019,
	}
	Anim {
		MinimumExtent { -64, -64, 0.199997 },
		MaximumExtent { 64, 64, 0.200003 },
		BoundsRadius 181.019,
	}
	MaterialID 0,
	SelectionGroup 0,
}
Bone "TextureBone" {
	ObjectId 0,
	Rotation 1 {
		DontInterp,
		0: { 0, 0, 0, 0 },
	}
	Scaling 5 {
		DontInterp,
		0: { 1, 1, 1 },
		2000: { 1, -1, 1 },
		2501: { 1, -1, 1 },
		3001: { 1, -1, 1 },
		3003: { 1, -1, 1 },
	}
	GeosetId 0,
	GeosetAnimId None,
}
PivotPoints 1 {
	{ 0, 0, 0 },
}
Camera "Name" {
	FieldOfView 0.785398,
	FarClip 10000,
	NearClip 1,
	Position { 2.7075, 0.00862157, 270.944 },
	Target {
		Position { 0, 0, 0.2 },
	}
}
рарити стоит везде 0, а есть 4 "Stand *" при этом проигрывается только одна из них при добавлении модельки на карту (а ведь должны тогда 4 сменяться)
хотя на тестовом переименовании модели из шапки из "Stand 12345" в "Stand abcd" - ничего не изменило и ротация всех стендов сохранилась, т.е. "Stand A-z" должно браться в авторотацию (а не только номерные "Stand 1-9"), но в этой модели из этого поста не берётся


poisoNDealer красава
не могу выбрать какой ответ из твоих трёх поставить в ответ - они все разные, правильные, и каждый друг друга дополняет
16

» WarCraft 3 / как выключить(задать) анимацию при добавлении модели на ланд ?

poisoNDealer: увидишь как у него периодически проигрываются Stand 1, Stand 2, Stand 3, с учётом редкости
так может как раз где то и выставляется дефолтный набор анимаций при добавлении на карту - и там можно выбрать или только одну или 10 любых с редкостью
если это зависит от названия - тогда почему в этой модели показывается только 1 из 4 стендов
на остальные 3 выставлена редкость 0/100 ? где выставлять эту редкость тогда?

пойду тестить тада
Загруженные файлы
16

» WarCraft 3 / как выключить(задать) анимацию при добавлении модели на ланд ?

poisoNDealer: Все анимации с названием Stand будут "дефолтными"
так там не "Stand"
а "Stand 12345"
анимация "Stand" только одна
тем более у меня есть модель, где 4 штуки "Stand*", но по дефолту проигрывается только первая (нулевая) (с двумя blp, как и указано на таймлайне)

переименовал в двух разных редакторах и сохранил в 2 разных файла - xgm.guru/files/100/316703/comments/521179/rename.zip
в обоих вариантах в WE и игре вообще пропали анимации кроме Stand и Death
а в обоих редакторах показываются все 7 анимаций как и ожидалось
какая же запара это ваше картоделание хосспаде
Загруженные файлы
16

» WarCraft 3 / как починить? - blp текстура отображается полосами

Принятый ответ
короче это из-за перехлёста по оси z между моделями, надо их подальше растянуть др от др и они перестанут и будут знать кто впереди а кто сзади
16

» WarCraft 3 / не отображается анимация в игре - как починить?

Принятый ответ
по итогу просмотровщик на сайте смог сделать больше чем спец софт предназначенный для редактирования моделей
надо было Stand и Death поставить в раскадровке перед всеми остальными анимациями
16

» WarCraft 3 / Demon Retera Model Studio 0.4.5m PTR

как удалить 4 неиспользуемых текстуры BookPortal?
если удаляю через War3ModelEditor, то потом при открытии в ретере - такое
если удаляю через ретеру - Tools - Edit Textures - то та же самая ошибка после открытия пересохранённого файла
версия ретеры 0.04.5h
или с таким надо в вопросы?

а всё
помимо самих текстур - надо было ещё их из анимаций удалить
16

» WarCraft 3 / Как можно хранить значения в юнитах? Аналог SetUnitUserData

вариант 1 имеет кучу ограничений:
SetUnitState - сначала идёт проверка по свойствам юнита в WE, и нельзя поставить значения вне рамок заданных в WE
SetUnitMoveSpeed - от 25 до 400
SetHeroStr SetHeroAgi SetHeroInt SetHeroXP SetHeroLevel - только героям
SetResourceAmount - тоже зависит от WE вроде
т.е. наиболее простые и оптимальные это варианты 0 3 4
SAND: Также можно сохранять и Real и Group и Unit, Str и тд, что позволяет сохранять хештаблица
так LoadInteger returns integer - как ты там сохранишь что-то кроме целого числа?
16

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

ScorpioT1000: Есть imHex
это который вместо расширенной ASCII-256 показывает точки?
или который не даёт редактировать значения?
и при этом который занимает 150 метров?
круто круто, мы как нить без такой годноты лучше посидим
nazarpunk: доделал парсер
ну вот, 2000 строк с ректами
а люди их предлагают вручную добавлять
нет уж, я лучше через ссылку от назарпанка
ректы добавляются хорошо
16

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

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

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

nazarpunk: Очищать глобальную группу G дешевле, чем дрочить создание/удаление локалки.
Глобальная группа очищается через ClearGroup
исправлено, на фпс не сказалось, но код стал на несколько строк меньше
nazarpunk: На каждого юнита вызывается UnitIndex. Тоесть лишний цикл на количество игроков. Можно просто каждому грибу записать его индекс через SetUnitUserData. Будет дешевле.
после переработки UnitIndex и переноса номера юнита в его хп - количество фпс увеличилось в разы
теперь можно с 30 коробками бегать в 64 фпс
и даже заспавнить 50 коробок двумя лесенками на 30 фпс
подробности на графике
код 1.7 тут controlc.com/4bf12fa3
16

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

nazarpunk: На каждого юнита вызывается UnitIndex. Тоесть лишний цикл на количество игроков. Можно просто каждому грибу записать его индекс через SetUnitUserData. Будет дешевле
в версии 1.5 не вылечил это место, т.к. через SetUnitUserData и GetUnitUserData можно хранить только 1 значение на каждого юнита
и это значение уже занято в функции Propelly__Main
Propelly__Main
function Propelly__Main takes nothing returns nothing
	local integer i=1
	local integer j=1
	if GetUnitTypeId(GetTriggerUnit())=='orai' then
		loop
			exitwhen Propelly__CompareRect[i]==null
			if GetTriggeringRegion()==Propelly__Rects[i]then
				loop
					exitwhen j>Stage_BoxsCount
					if GetUnitTypeId(OrangeMushroom[PLAYER_MAXINUM+j])=='orai' and GetTriggerUnit()==OrangeMushroom[PLAYER_MAXINUM+j]and GetUnitUserData(GetTriggerUnit())!=i then
						call SetUnitUserData(GetTriggerUnit(),i)
						if Propelly__Angle[i]=="Left" then
							if GravityChanger_State==false then
								call SetUnitAnimation(GetTriggerUnit(),"Stand First")
							else
								call SetUnitAnimation(GetTriggerUnit(),"Stand Second")
							endif
							set LeftArrow[PLAYER_MAXINUM+j]=true
							set RightArrow[PLAYER_MAXINUM+j]=false
						elseif Propelly__Angle[i]=="Right" then
							if GravityChanger_State==false then
								call SetUnitAnimation(GetTriggerUnit(),"Stand Second")
							else
								call SetUnitAnimation(GetTriggerUnit(),"Stand First")
							endif
							set LeftArrow[PLAYER_MAXINUM+j]=false
							set RightArrow[PLAYER_MAXINUM+j]=true
						else
							set LeftArrow[PLAYER_MAXINUM+j]=false
							set RightArrow[PLAYER_MAXINUM+j]=false
						endif
						set gravity[PLAYER_MAXINUM+j]=Propelly__FlyGravity[i]
					endif
					set j=j+1
				endloop
				return
			endif
			set i=i+1
		endloop
	endif
endfunction

function Propelly__SetRect takes trigger t,integer i,rect r,real g,string a returns nothing
	set Propelly__Rects[i]=CreateRegion()
	call RegionAddRect(Propelly__Rects[i],r)
	set Propelly__FlyGravity[i]=g
	set Propelly__CompareRect[i]=r
	set Propelly__Angle[i]=a
	call TriggerRegisterEnterRegion(t,Propelly__Rects[i],null)
endfunction

function Propelly__init takes nothing returns nothing
	local trigger t=CreateTrigger()
	call Propelly__SetRect(t,1,gg_rct_PropellyMove001,10,"none")
	call TriggerAddAction(t,function Propelly__Main)
	set t=null
endfunction
буду искать какими способами можно хранить в юнитах числовую информацию
т.к. на тестах после замены UnitIndex(u) на GetUnitUserData(u) фпс поднялся в разы
например 40 фпс наступает не при -box1 20 , а уже при -box1 37
а если сделать две лесенки: -ladder2 20 + 30 раз -box - итого 50 коробок двумя лесенками - то будет 30 фпс
а в текущей версии на 50 коробках фпс упадёт до 0 из-за UnitIndex
nazarpunk: Очищать глобальную группу G дешевле, чем дрочить создание/удаление локалки.
потестировать это пока не удалось, т.к. коллизии всегда выдавали true и коробки проваливались - наверное неправильно очищал группу через дестрой, покурю ещё это место
Загруженные файлы
16

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

обновлено до версии 1.5
теперь полноценно можно заспавнить 50 коробок и мерять свои фепосы
EN xgm.guru/files/100/315886/comments/520926/OMS_BoxLab_1.5_EN.w3x
RU xgm.guru/files/100/315886/comments/520926/OMS_BoxLab_1.5_RU.w3x
код 1.5 controlc.com/fce08fe1
дальше уже только оптимизация кода для повышения фпс
Загруженные файлы
16

» WarCraft 3 / Текстовый редактор триггеров

как вызвать текстовые триггеры как в примере ниже?
откуда вызвать?
они запускаются при старте карты через варик
F4 - клик триггер - правка - конвертировать в текст
16

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

Jack-of-shadow: Но там еще была загвоздка с тем, что весь террейн был разрушаемый. По этому при разрушении клетки
тут тоже самое, если кодом убрать под собой ландшафт, то все объекты полетят вниз пока не долетят до следующей твёрдой клетки
16

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

nazarpunk: лучше перебирать группы не через удаление юнита, а через ForGroup. Она к тому же создаёт псевдопоток, что позволяет обойти оплимит
попробовал накалякать через ForGroup
Открыть код и видео
globals
	integer MushroomMoving_CollisionCheck_i
	real MushroomMoving_CollisionCheck_x
	real MushroomMoving_CollisionCheck_y
	boolean array MushroomMoving_CollisionCheck_boo
endglobals

function MushroomMoving_CollisionCheck_ForGroup takes nothing returns nothing
	local unit u=GetEnumUnit()
	local integer j=0
	local real otherx
	local real othery
	local integer i = MushroomMoving_CollisionCheck_i
	local real x = MushroomMoving_CollisionCheck_x
	local real y = MushroomMoving_CollisionCheck_y
	if u!=OrangeMushroom[i] then
		set j=UnitIndex(u)
		if (GetPlayerSlotState(GetOwningPlayer(OrangeMushroom[j]))==PLAYER_SLOT_STATE_PLAYING or j>PLAYER_MAXINUM) and LevelClearState[j]==false then
			if MB_Frame_On==1 then
				set MB_CollisionY = MB_CollisionY+1
			endif
			set otherx=GetUnitX(OrangeMushroom[j])
			set othery=GetUnitY(OrangeMushroom[j])
			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
						set Frame_MainPlayerY=j
						set MushroomMoving_CollisionCheck_boo[i]=false
						return
					endif
				else
					set u=null
					set Frame_MainPlayerY=j
					set MushroomMoving_CollisionCheck_boo[i]=false
					return
				endif
			endif
		endif
	endif
	set u=null
	set MushroomMoving_CollisionCheck_boo[i]=true
	return
endfunction

function MushroomMoving_CollisionCheck takes integer i,real x,real y returns boolean
	local group G = CreateGroup()
	set MushroomMoving_CollisionCheck_i=i
	set MushroomMoving_CollisionCheck_x=x
	set MushroomMoving_CollisionCheck_y=y
	call GroupEnumUnitsInRange(G, x,y, 128, null)
	call ForGroup(G,function MushroomMoving_CollisionCheck_ForGroup)
	return MushroomMoving_CollisionCheck_boo[i]
	call DestroyGroup(G)
	set G=null
endfunction
коллизии начали кашлять
особенно в конце видео где 3 коробки - там видна рандомность - то стоит на коробке то проваливается


Jack-of-shadow: попробуй что то типо того:
сначала попробовал по аналогии с твоим кодом , только таймер в 100 раз меньше чем 0.02 = чтобы просчитать 100 коробок за 1 фрейм
call TriggerRegisterTimerEvent(t,0.0002,true)
и даже если коробок 10 а не 100, то просчитает всё за 10 тиков, а остальные 90 будет скипать
а call Frame__SquaresMoving(i) отключил, то есть Frame__SquaresMoving просчитывается отдельным кодом вообще
что должно сказаться на физике
Открыть код и скриншот
globals
	integer playersCurrectFrameOffset = 1
endglobals

function Frame__SquaresMoving2 takes nothing returns nothing
local integer i
	local real saveMaxG=-30
	local integer j=1
if playersCurrectFrameOffset <= PLAYER_MAXINUM+Stage_BoxsCount then
	set i = playersCurrectFrameOffset
	set Frame__SpeedX=8
	set Frame_MainPlayer=i
	if LevelClearState[i]==false then
		call Frame__MovingX(i,GetUnitX(OrangeMushroom[i]),GetUnitY(OrangeMushroom[i]))
		call Frame__MovingY(i,GetUnitX(OrangeMushroom[i]),GetUnitY(OrangeMushroom[i]))
		if s__StatusBorad_World[Status]>=6 then
			if IsUnitInRegion(Water_Rects,OrangeMushroom[i])==true then
				set saveMaxG=-10
			endif
		endif
		if GetUnitTypeId(OrangeMushroom[i])!='orai' then
			if Water_State[i]==true and DownArrow[i]==true then
				set gravity[i]=-15
			else
				if gravity[i]>saveMaxG then
					set gravity[i]=gravity[i]-2.0
				elseif gravity[i]<saveMaxG then
					set gravity[i]=saveMaxG
				endif
			endif
		endif
		if GetUnitTypeId(OrangeMushroom[i])!='orai' then
			if Frame__AccelerationCheck[i]==false then
				if Acceleration[i]!=0 then
					if Acceleration[i]>60 then
						set Acceleration[i]=60
					elseif Acceleration[i]>1 then
						set Acceleration[i]=Acceleration[i]-1
					elseif Acceleration[i]<-60 then
						set Acceleration[i]=-60
					elseif Acceleration[i]<-1 then
						set Acceleration[i]=Acceleration[i]+1
					else
						set Acceleration[i]=0
					endif
				endif
			else
				set Frame__AccelerationCheck[i]=false
			endif
		endif
	endif
        set playersCurrectFrameOffset = playersCurrectFrameOffset+1
endif	
endfunction

function Frame__SquaresMoving2Init takes nothing returns nothing
	local trigger t=CreateTrigger()
	call TriggerRegisterTimerEvent(t,0.0002,true)
	call TriggerAddAction(t,function Frame__SquaresMoving2)
endfunction 

function Frame__PlayersGroup takes nothing returns nothing
	local integer i=1
	if GravityChanger_Loading==false then
		set Frame__BoxState=false
		loop
			exitwhen i>PLAYER_MAXINUM
			if GetPlayerSlotState(Player(i-1))==PLAYER_SLOT_STATE_PLAYING then
				set Frame__OldX[i]=GetUnitX(OrangeMushroom[i])
				set Frame__OldY[i]=GetUnitY(OrangeMushroom[i])
			endif
			set i=i+1
		endloop
		set i=1
		loop
			exitwhen i>PLAYER_MAXINUM+Stage_BoxsCount
			if i<=PLAYER_MAXINUM then
				if GetPlayerSlotState(Player(i-1))==PLAYER_SLOT_STATE_PLAYING then
					if CinematicMode==false then
						if Observer_ViewNumber[i]==0 then
							if GravityChanger_State==false then
								call SetCameraTargetControllerNoZForPlayer(Player(i-1),OrangeMushroom[i],0,128,false)
							else
								call SetCameraTargetControllerNoZForPlayer(Player(i-1),OrangeMushroom[i],0,-128,false)
							endif
						else
							if GravityChanger_State==false then
								call SetCameraTargetControllerNoZForPlayer(Player(i-1),OrangeMushroom[Observer_ViewNumber[i]],0,128,false)
							else
								call SetCameraTargetControllerNoZForPlayer(Player(i-1),OrangeMushroom[Observer_ViewNumber[i]],0,-128,false)
							endif
						endif
					endif
					//call Frame__SquaresMoving(i)
				endif
			else
				set Frame__BoxState=true
				//call Frame__SquaresMoving(i)
			endif
			set i=i+1
		endloop
		set Frame__BoxState=false
		set i=1
		loop
			exitwhen i>PLAYER_MAXINUM+Stage_BoxsCount
			if i<=PLAYER_MAXINUM then
				if GetPlayerSlotState(Player(i-1))==PLAYER_SLOT_STATE_PLAYING then
					if CinematicMode==false then
						call BackGroundMove(i,Frame__OldX[i],Frame__OldY[i])
					endif
					set Frame__PropellyState[i]=false
					set Frame__GravityState[i]=false
					if NameTextTag[i]!=null then
						if GravityChanger_State==false then
							call SetTextTagPos(NameTextTag[i],GetUnitX(OrangeMushroom[i])-50,GetUnitY(OrangeMushroom[i])-120,0)
						else
							call SetTextTagPos(NameTextTag[i],GetUnitX(OrangeMushroom[i])+50,GetUnitY(OrangeMushroom[i])+120,0)
						endif
					endif
					call Jumper_Main(i)
					if s__StatusBorad_World[Status]==6 and IsPointInRegion(Arrow_AllRects,GetUnitX(OrangeMushroom[i]),GetUnitY(OrangeMushroom[i]))then
						call Arrow_SecretAction(i)
					endif
				endif
			else
				if Stage_BoxsCount !=0 then
					set Frame__PropellyState[i]=false
					set Frame__GravityState[i]=false
					call Jumper_Main(i)
					if s__StatusBorad_World[Status]==6 and IsPointInRegion(Arrow_AllRects,GetUnitX(OrangeMushroom[i]),GetUnitY(OrangeMushroom[i]))then
						call Arrow_SecretAction(i)
					endif
				endif
			endif
			set i=i+1
		endloop
	endif
endfunction

function main takes nothing returns nothing
call Frame__SquaresMoving2Init()
endfunction
но чё то не завелось, гриб на старте висит в воздухе и не ходит


зато твоя идея
+ этот пост:
nazarpunk: Условно хаотично бывает в асинхронных языках, где ты в жассе нашёл асинхронность?
натолкнули меня на ещё более простое и легко встраиваемое решение через TriggerEvaluate
Открыть код
globals
	trigger Frame__SquaresMoving3Trg = CreateTrigger()
	integer playersCurrectFrameOffset = 1
endglobals

function Frame__SquaresMoving3Act takes nothing returns boolean
local integer i=playersCurrectFrameOffset
	local real saveMaxG=-30
	local integer j=1
	set Frame__SpeedX=8
	set Frame_MainPlayer=i
	if LevelClearState[i]==false then
		call Frame__MovingX(i,GetUnitX(OrangeMushroom[i]),GetUnitY(OrangeMushroom[i]))
		call Frame__MovingY(i,GetUnitX(OrangeMushroom[i]),GetUnitY(OrangeMushroom[i]))
		if s__StatusBorad_World[Status]>=6 then
			if IsUnitInRegion(Water_Rects,OrangeMushroom[i])==true then
				set saveMaxG=-10
			endif
		endif
		if GetUnitTypeId(OrangeMushroom[i])!='orai' then
			if Water_State[i]==true and DownArrow[i]==true then
				set gravity[i]=-15
			else
				if gravity[i]>saveMaxG then
					set gravity[i]=gravity[i]-2.0
				elseif gravity[i]<saveMaxG then
					set gravity[i]=saveMaxG
				endif
			endif
		endif
		if GetUnitTypeId(OrangeMushroom[i])!='orai' then
			if Frame__AccelerationCheck[i]==false then
				if Acceleration[i]!=0 then
					if Acceleration[i]>60 then
						set Acceleration[i]=60
					elseif Acceleration[i]>1 then
						set Acceleration[i]=Acceleration[i]-1
					elseif Acceleration[i]<-60 then
						set Acceleration[i]=-60
					elseif Acceleration[i]<-1 then
						set Acceleration[i]=Acceleration[i]+1
					else
						set Acceleration[i]=0
					endif
				endif
			else
				set Frame__AccelerationCheck[i]=false
			endif
		endif
	endif
return false
endfunction 

function Frame__SquaresMoving3Init takes nothing returns nothing
	call TriggerAddCondition(Frame__SquaresMoving3Trg, Condition(function Frame__SquaresMoving3Act))
endfunction

function Frame__PlayersGroup takes nothing returns nothing
	local integer i=1
	if GravityChanger_Loading==false then
		set Frame__BoxState=false
		loop
			exitwhen i>PLAYER_MAXINUM
			if GetPlayerSlotState(Player(i-1))==PLAYER_SLOT_STATE_PLAYING then
				set Frame__OldX[i]=GetUnitX(OrangeMushroom[i])
				set Frame__OldY[i]=GetUnitY(OrangeMushroom[i])
			endif
			set i=i+1
		endloop
		set i=1
		loop
			exitwhen i>PLAYER_MAXINUM+Stage_BoxsCount
			set playersCurrectFrameOffset=i
			if i<=PLAYER_MAXINUM then
				if GetPlayerSlotState(Player(i-1))==PLAYER_SLOT_STATE_PLAYING then
					if CinematicMode==false then
						if Observer_ViewNumber[i]==0 then
							if GravityChanger_State==false then
								call SetCameraTargetControllerNoZForPlayer(Player(i-1),OrangeMushroom[i],0,128,false)
							else
								call SetCameraTargetControllerNoZForPlayer(Player(i-1),OrangeMushroom[i],0,-128,false)
							endif
						else
							if GravityChanger_State==false then
								call SetCameraTargetControllerNoZForPlayer(Player(i-1),OrangeMushroom[Observer_ViewNumber[i]],0,128,false)
							else
								call SetCameraTargetControllerNoZForPlayer(Player(i-1),OrangeMushroom[Observer_ViewNumber[i]],0,-128,false)
							endif
						endif
					endif
					call TriggerEvaluate(Frame__SquaresMoving3Trg)
				endif
			else
				set Frame__BoxState=true
				call TriggerEvaluate(Frame__SquaresMoving3Trg)
			endif
			set i=i+1
		endloop
		set Frame__BoxState=false
		set i=1
		loop
			exitwhen i>PLAYER_MAXINUM+Stage_BoxsCount
			if i<=PLAYER_MAXINUM then
				if GetPlayerSlotState(Player(i-1))==PLAYER_SLOT_STATE_PLAYING then
					if CinematicMode==false then
						call BackGroundMove(i,Frame__OldX[i],Frame__OldY[i])
					endif
					set Frame__PropellyState[i]=false
					set Frame__GravityState[i]=false
					if NameTextTag[i]!=null then
						if GravityChanger_State==false then
							call SetTextTagPos(NameTextTag[i],GetUnitX(OrangeMushroom[i])-50,GetUnitY(OrangeMushroom[i])-120,0)
						else
							call SetTextTagPos(NameTextTag[i],GetUnitX(OrangeMushroom[i])+50,GetUnitY(OrangeMushroom[i])+120,0)
						endif
					endif
					call Jumper_Main(i)
					if s__StatusBorad_World[Status]==6 and IsPointInRegion(Arrow_AllRects,GetUnitX(OrangeMushroom[i]),GetUnitY(OrangeMushroom[i]))then
						call Arrow_SecretAction(i)
					endif
				endif
			else
				if Stage_BoxsCount !=0 then
					set Frame__PropellyState[i]=false
					set Frame__GravityState[i]=false
					call Jumper_Main(i)
					if s__StatusBorad_World[Status]==6 and IsPointInRegion(Arrow_AllRects,GetUnitX(OrangeMushroom[i]),GetUnitY(OrangeMushroom[i]))then
						call Arrow_SecretAction(i)
					endif
				endif
			endif
			set i=i+1
		endloop
	endif
endfunction

function main takes nothing returns nothing
	call Frame__SquaresMoving3Init()
endfunction
теперь варик не захлёбывается, ник не отклеивается, и каждый гриб(ящик) просчитывается отдельным потоком с сохранением физики
макс количество коробок поднялось до 50+ и уже упирается всё в fps
-box1 поднялось с 11(v1.0) 14(v1.4) до 22 (выше тоже можно но фпс ниже 20)
-box3 поднялось с 11(v1.0) 25(v1.4) до 35 (20 фпс)
при отключении -pro режима фпс вырастет с 20 до 40
теперь осталось причесать код (указанные выше UnitIndex и global G) и опять обновлять версию
а если найти ошибки в 1 и 2 варианте выше в этом посте то и сравнить на скорость и фпс все 3 способа
Загруженные файлы