В кратце, в режиме сетевой игры происходит десинхронизация случайных игроков в одной карте
Я уже не знаю чего я только не проверял, некоторые вещи скорее всего даже по 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
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
23
4 года назад
0
Держись, друг, помогу тестами, но по алгоритму не очень опытен с десинками и кодом
0
37
4 года назад
Отредактирован ScorpioT1000
0
Вот это запросто может десинкнуть
if BlzGetLocale()=="ruRU" then
  mes="Герой полностью здоров"
else
  mes="HP is full"
end
0
32
4 года назад
0
ScorpioT1000,
Сейчас карта локализована через GetLocale() , но десинхи начались до, и были после полного после отключения локали

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

-- ....

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

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

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