В кратце, в режиме сетевой игры происходит десинхронизация случайных игроков в одной карте
Я уже не знаю чего я только не проверял, некоторые вещи скорее всего даже по 2 раза, но пришёл к выводу, что десинх происходит именно при вызове лишь 1 функции
UnitDamageArea
её полный код
function UnitDamageArea(u,damage,x,y,range,ZDamageSource,EffectModel)
	local isdamage=false
	local e=nil
	local hero=nil



	--print("Поиск целей в на высоте "..ZDamageSource)
	--local mperebor=CreateGroup()
	GroupEnumUnitsInRange(perebor,x,y,range,nil)
	while true do
		e = FirstOfGroup(perebor)
		if e == nil then break end
		if UnitAlive(e) and UnitAlive(u) and IsUnitEnemy(e,GetOwningPlayer(u))  and true then --and IsUnitZCollision(e,ZDamageSource)  -- момент урона
			--print("вызов проблемной функции "..GetPlayerName(GetOwningPlayer(u)).." "..GetUnitName(u).." "..damage)
			if EffectModel~=nil then
				--print("эффеет")
				--local DE=AddSpecialEffect(EffectModel,GetUnitX(e),GetUnitY(e))
				--BlzSetSpecialEffectZ(DE,ZDamageSource)
				--DestroyEffect(DE)
			end
			if IsUnitType(u,UNIT_TYPE_HERO) then
				local data=HERO[GetPlayerId(GetOwningPlayer(u))]
				--if data.

				if data.HaveAFire then --урон от фаербола
					damage=damage*5
					data.HaveAFire=false
					if not data.Perk16 then
						UnitRemoveAbility(u,FourCC('A006'))
					end
					FlyTextTagCriticalStrike(e,I2S(R2I(damage)),GetOwningPlayer(u))
				end

			end
			UnitDamageTarget( u, e, damage, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS )
			--print("урон прошёл для "..GetUnitName(e))
			isdamage=true
			hero=e
		end
		--ремонт
		if  true and UnitAlive(e) and IsUnitAlly(e,GetOwningPlayer(u)) and e~=u and IsUnitType(u,UNIT_TYPE_HERO)  then -- момент ремонта

			local data=HERO[GetPlayerId(GetOwningPlayer(u))]
			if GetUnitTypeId(e)==FourCC('n007') and damage>6 then-- попытка ударить свинку лечилку
				if DistanceBetweenXY(GetUnitX(u),GetUnitY(u),GetUnitXY(e))<=70 then
					local x,y=GetUnitXY(u)
					local mes=""
					if BlzGetLocale()=="ruRU" then
						mes="Герой полностью здоров"
					else
						mes="HP is full"
					end
					FlyTextTagHealXY(x,y,mes,GetOwningPlayer(u))
				end
			end
			if DistanceBetweenXY(GetUnitX(u),GetUnitY(u),GetUnitXY(e))<=200 and (IsUnitType(e,UNIT_TYPE_STRUCTURE) or IsUnitType(e,UNIT_TYPE_MECHANICAL)) then
				if GetUnitTypeId(e)==FourCC('n003') then-- костер
					data.FireCount=data.FireCount+1
					if not data.Perk9 then
						if data.FireCount>=5 then
							data.Perk9=true
							--print("разблокировка перка")
							PerkUnlocker(data,9)
						end
					end
					if data.Perk9 then
						UnitAddAbility(u,FourCC('A006'))
						data.HaveAFire=true
					end
				end
				--print("лечим")
				if not data.OnCharge and data.ShieldForce then-- нельзя чинить при рывке щита и при толчке щитом
					local heal=HealUnit(e,BlzGetUnitBaseDamage(u,0))
					data.Repairs=data.Repairs+heal
					data.RevoltSec=0
					if not data.Perk6 then
						if data.Repairs>=1000 then
							data.Perk6=true
							PerkUnlocker(data,6)
						end
					end
				end
			end
			hero=e
		end
		GroupRemoveUnit(perebor,e)
	end
	--DestroyGroup(mperebor)
	--mperebor=nil
	if PointContentDestructable(x,y,range,true,1+damage/4,u) then	isdamage=true	end
	return isdamage, hero
end
её проблемный кусок кода
		if UnitAlive(e) and UnitAlive(u) and IsUnitEnemy(e,GetOwningPlayer(u))  and true then --and IsUnitZCollision(e,ZDamageSource)  -- момент урона
			--print("вызов проблемной функции "..GetPlayerName(GetOwningPlayer(u)).." "..GetUnitName(u).." "..damage)
			UnitDamageTarget( u, e, damage, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS )
			--print("урон прошёл для "..GetUnitName(e))
			isdamage=true
			hero=e
		end
То бишь если убрать урон по юнитам то десинхроны прекращаются,
Функция это делает практически всё, она и чинит и ломает, и определяет колизию и рубит деревья.. вызывает любое взаимодействие
А теперь очень подробно что я уже делал

Что я уже делал

Сначала думал, что дело в фреймах - выключал весь кастом интерфейс - нет
Потому я думал, что проблема в частом использовании GetLocalPlayer - нет
Потом я подумал что проблема принципе в использовании локального игрока, и я убрал его на 100% на карте даже для звуков и даже внутри BJ - нет
Потом я уже включил гугл попалась статья на хайве
И я полностью прошёлся по списку:
2. Не проверенные слухи
2a. Полностью удалил проверки о состоянии статуса слота игрока
2b. BlzGetLocalSpecialEffectZ использую, полностью отключал и даже не смотря на то что вырезал проверку координаты Z при нанесении урона
2c. SoundVolumeBJ используется, я полностью отключал все звуки в том числе в дочерних BJ функциях
3. Вероятные причины
3a. SyncSelection, выбор происходит при старте игры , и каждый раз после смерти, выбор не участвует в принципе, весь код будет работать даже если юнит не будет выбран, это вообще на важно, отключал полностью - результата нет
3b. GameCacheSync - не использую
3с. SetSkyModel - не использую
3d. Список функций якобы вызывающих десинх
GetDestructableName - не использую
GetSoundDuration - не использую
GetSoundFileDuration - не использую
GetCameraBoundMinX - не использую
GetCameraBoundMinY - не использую
GetCameraBoundMaxX - не использую
GetCameraBoundMaxY - не использую
GetCameraField - не использую
GetCameraTargetPositionX - не использую
GetCameraTargetPositionY - не использую
GetCameraTargetPositionZ - не использую
GetCameraTargetPositionLoc - не использую
GetCameraEyePositionX - не использую
GetCameraEyePositionY - не использую
GetCameraEyePositionZ - не использую
GetCameraEyePositionLoc - не использую
GetObjectName - не использую
GetLocalizedString - не использую
GetLocalizedHotkey - не использую
GetLocalPlayer - пробовал полностью отключал, писал об этом выше
GetLocationZ - используется, но нигде не учитывается высота декора, использую уже много лет в составе GetUnitZ и GetTerrainZ
GetItemName - не использую
GetUnitName - использую для дебага в принтах, которых нет в реальной игре
GetPlayerSlotState - использов, но отключил - не помогло
IsMultiboardMinimized - не использую
BlzGetLocalUnitZ - не использую
BlzGetUnitZ - не использую
BlzGetItemDescription - не использую
BlzGetItemTooltip - не использую
BlzGetItemExtendedTooltip - не использую
BlzGetLocalSpecialEffectX -
BlzGetLocalSpecialEffectY -
BlzGetLocalSpecialEffectZ - Все 3 использую постоянно для перемещения эффектов, но в момент нанесения урона эффект не перемещается и эти функции не используются, отключить нельзя ибо это основа игры, код использующий эти функции не менялся с момент создания карты и не вызывал десинхи ранее
4. Систематически известные причины:
4a. GetLocalPlayer() - я его отключал полностью на 100% даже внутри BJ - не помогло
4b. Деформации местности - Использовал эффект стомп горного , с деформацией местности, его полное отключение не решило проблему
4с и d . Поворот камеры, камера не используется, для каких либо расчетов в принципе
4e. Всякий раз тесты провожу чистые с запускам новых клиентов
5. Случайные известные причины:
5a. Сравнение игровых слотов - Хз что это, я сравниваю владельца игроков, щас бы ещё проверка игрока стала барахлить, точно не оно
5b. Сравнение контроллера игрока - отключал не помогло
5c. Слишком много улучшений - не использую улучшения
5d. GetLocationZ () При деформации земли или проходимых участках - деформация отключена, проходимого декора нет
5e. Редактирование констант крипов - не редактировалось
5f. Модели и и текстуры, когда плохо сделаны - Полностью проверял без моделей и текстур - не помогло
5g. Очень, очень, очень большое количество утечек памяти - да, ибо ничего не очищаю, всё делает сборщик мусора на луа, но так как происходит и десинх на 30 секунде игры, при атаке например по крипу, то это точно не оно
Использование pairs при переборе основной таблицы героев, было, заменил на for - не помогло
		--for i, data in pairs(HERO) do --было
		for i=0,3 do
			local data=HERO[i] -- стало
Тесты проводятся НА одной локализации
На 1 версии ГРАФИКИ SD или HD, не важно вообще
Сейчас карта локализована через GetLocale() , но десинхи начали до, и были после полного отключения локали
Игроками можно вообще ничего не делать, ну скажем, достаточно стоять полностью на базе и даже не взаимодействовать и 2 оставшихся играющих ИИ совершат атаку и вызовут десинх
Пробовал полностью без ИИ - десинх
Сейчас использую 1 единственную глобальную группу perebor для перебора всех групп, пробовал сделать локалку - не помогает
Пробовал убрать событие EventDamaging - не помогает
Финансово отблагодарю любого кто сможешь помочь мне избавиться от десинхрона, это уже дело принципа!!!
Мои глаза забыли что такое солнечный свет

Причина: причин было много, а я искал лишь одну
Самыми распространёнными оказались элементарные ошибки в коде, отсутствие параметров, параметры не того типа данных (привет динамическая типизация) или лишние параметры, из за чего происходили "рандомные рассинхроны при обрыве потока"
Огромное спасибо пользователю prog, что откликнулся и смог найти ошибки, а нашёл он их при помощи языкового сервера sumneko lua для VScode
`
ОЖИДАНИЕ РЕКЛАМЫ...
25
Держись, друг, помогу тестами, но по алгоритму не очень опытен с десинками и кодом
38
Вот это запросто может десинкнуть
if BlzGetLocale()=="ruRU" then
  mes="Герой полностью здоров"
else
  mes="HP is full"
end
33
ScorpioT1000,
Сейчас карта локализована через GetLocale() , но десинхи начались до, и были после полного после отключения локали

Темболее я провожу тесты исключительно в 1 локале ruRU.. и это сообщение получить возможно лишь в ультраредком случае, а десинх возникает и без него
38
Попробуй дамажить не в цикле фор, а в периоде. Или чисто для теста вейт вставь минимальный в каждой итерации. Мб это луа не может синкнуть дамаг адекватно
7
ScorpioT1000:
Вот это запросто может десинкнуть
if BlzGetLocale()=="ruRU" then
  mes="Герой полностью здоров"
else
  mes="HP is full"
end
надо сохранить эту строчку))
38
А чем старый добрый L не угодил?)
function L(ru, en)
  return BlzGetLocale()=="ruRU" and ru or en
end

-- ....

print(L("Привет!", "Hello!"))

Причем потом поиском L( можно еще пару языков докидывать и не париться
33
ScorpioT1000, я хотел так сделать, но потом забил и локализацию не довёл до ума, ибо и без неё проблем хватает =(
33
Причина: причин было много, а я искал лишь одну
Самыми распространёнными оказались элементарные ошибки в коде, отсутствие параметров, параметры не того типа данных (привет динамическая типизация) или лишние параметры, из за чего происходили "рандомные рассинхроны при обрыве потока"
Огромное спасибо пользователю prog, что откликнулся и смог найти ошибки, а нашёл он их при помощи языкового сервера sumneko lua для VScode
Принятый ответ
24
при помощи языкового сервера sumneko lua для VScode
Не все - передачу nil в координаты для создания звука ловил уже сам, без помощи языкового сервера.

Наиболее вероятной причиной десинков было падение потока выполнения из-за рантайм ошибок, очевидно после падения потока выполнения игра не всегда способна сама восстановиться в синхронное состояние. Отсутствие дефолтного еррор-хендлера в близовской интеграции луа это большая проблема - так бы Bergi_Bear заметил эти ошибки сам и ему пришлось бы их фиксить задолго до того, как обнаружились бы десинки.
38
Расскажите хоть для остальных, в чем суть была в деталях?
13
В моей карте после выхода нового патча начало дропать тупо всех в начале игры. На предыдущих версиях этой проблемы не было. В сингле эта проблема не наблюдается. Что делать совершенно не понятно.
33
Десинхи вначале сто процентов наблюдаются из за разности графики, из вариантов решения месяц лучше перевести карту на ход или сд режим, тоесть отключить гибрида
13
А в редакторе есть настройка, где можно принудительно заставить игроков играть в hd режиме?
33
Да, как для самого редактора так и для карты.. так же есть внешний переключатель - спс Hodor, но для этого надо работать в режиме папки
Рекомендуется использовать везде SD режим при разработке, это значительно повышает скорость тестов
Загруженные файлы
33
HappyAndRu, кароче я проверил 5 раз, и 4/5 получил десинх при старте, если выставлен режим HD
Чтобы оставить комментарий, пожалуйста, войдите на сайт.