В кратце, в режиме сетевой игры происходит десинхронизация случайных игроков в одной карте
Я уже не знаю чего я только не проверял, некоторые вещи скорее всего даже по 2 раза, но пришёл к выводу, что десинх происходит именно при вызове лишь 1 функции
UnitDamageArea
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 - нет
Потом я уже включил гугл попалась статья на хайве
Потому я думал, что проблема в частом использовании GetLocalPlayer - нет
Потом я подумал что проблема принципе в использовании локального игрока, и я убрал его на 100% на карте даже для звуков и даже внутри BJ - нет
Потом я уже включил гугл попалась статья на хайве
И я полностью прошёлся по списку:
2. Не проверенные слухи
2a. Полностью удалил проверки о состоянии статуса слота игрока
2b. BlzGetLocalSpecialEffectZ использую, полностью отключал и даже не смотря на то что вырезал проверку координаты Z при нанесении урона
2c. SoundVolumeBJ используется, я полностью отключал все звуки в том числе в дочерних BJ функциях
2a. Полностью удалил проверки о состоянии статуса слота игрока
2b. BlzGetLocalSpecialEffectZ использую, полностью отключал и даже не смотря на то что вырезал проверку координаты Z при нанесении урона
2c. SoundVolumeBJ используется, я полностью отключал все звуки в том числе в дочерних BJ функциях
3. Вероятные причины
3a. SyncSelection, выбор происходит при старте игры , и каждый раз после смерти, выбор не участвует в принципе, весь код будет работать даже если юнит не будет выбран, это вообще на важно, отключал полностью - результата нет
3b. GameCacheSync - не использую
3с. SetSkyModel - не использую
3d. Список функций якобы вызывающих десинх
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 использую постоянно для перемещения эффектов, но в момент нанесения урона эффект не перемещается и эти функции не используются, отключить нельзя ибо это основа игры, код использующий эти функции не менялся с момент создания карты и не вызывал десинхи ранее
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. Всякий раз тесты провожу чистые с запускам новых клиентов
4a. GetLocalPlayer() - я его отключал полностью на 100% даже внутри BJ - не помогло
4b. Деформации местности - Использовал эффект стомп горного , с деформацией местности, его полное отключение не решило проблему
4с и d . Поворот камеры, камера не используется, для каких либо расчетов в принципе
4e. Всякий раз тесты провожу чистые с запускам новых клиентов
5. Случайные известные причины:
5a. Сравнение игровых слотов - Хз что это, я сравниваю владельца игроков, щас бы ещё проверка игрока стала барахлить, точно не оно
5b. Сравнение контроллера игрока - отключал не помогло
5c. Слишком много улучшений - не использую улучшения
5d. GetLocationZ () При деформации земли или проходимых участках - деформация отключена, проходимого декора нет
5e. Редактирование констант крипов - не редактировалось
5f. Модели и и текстуры, когда плохо сделаны - Полностью проверял без моделей и текстур - не помогло
5g. Очень, очень, очень большое количество утечек памяти - да, ибо ничего не очищаю, всё делает сборщик мусора на луа, но так как происходит и десинх на 30 секунде игры, при атаке например по крипу, то это точно не оно
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() , но десинхи начали до, и были после полного отключения локали
На 1 версии ГРАФИКИ SD или HD, не важно вообще
Сейчас карта локализована через GetLocale() , но десинхи начали до, и были после полного отключения локали
Игроками можно вообще ничего не делать, ну скажем, достаточно стоять полностью на базе и даже не взаимодействовать и 2 оставшихся играющих ИИ совершат атаку и вызовут десинх
Пробовал полностью без ИИ - десинх
Сейчас использую 1 единственную глобальную группу perebor для перебора всех групп, пробовал сделать локалку - не помогает
Пробовал убрать событие EventDamaging - не помогает
Пробовал полностью без ИИ - десинх
Сейчас использую 1 единственную глобальную группу perebor для перебора всех групп, пробовал сделать локалку - не помогает
Пробовал убрать событие EventDamaging - не помогает
Финансово отблагодарю любого кто сможешь помочь мне избавиться от десинхрона, это уже дело принципа!!!
Мои глаза забыли что такое солнечный свет
Мои глаза забыли что такое солнечный свет
Принятый ответ
Причина: причин было много, а я искал лишь одну
Самыми распространёнными оказались элементарные ошибки в коде, отсутствие параметров, параметры не того типа данных (привет динамическая типизация) или лишние параметры, из за чего происходили "рандомные рассинхроны при обрыве потока"
Огромное спасибо пользователю prog, что откликнулся и смог найти ошибки, а нашёл он их при помощи языкового сервера sumneko lua для VScode
Самыми распространёнными оказались элементарные ошибки в коде, отсутствие параметров, параметры не того типа данных (привет динамическая типизация) или лишние параметры, из за чего происходили "рандомные рассинхроны при обрыве потока"
Огромное спасибо пользователю prog, что откликнулся и смог найти ошибки, а нашёл он их при помощи языкового сервера sumneko lua для VScode
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован ScorpioT1000
Сейчас карта локализована через GetLocale() , но десинхи начались до, и были после полного после отключения локали
Отредактирован ScorpioT1000
Самыми распространёнными оказались элементарные ошибки в коде, отсутствие параметров, параметры не того типа данных (привет динамическая типизация) или лишние параметры, из за чего происходили "рандомные рассинхроны при обрыве потока"
Огромное спасибо пользователю prog, что откликнулся и смог найти ошибки, а нашёл он их при помощи языкового сервера sumneko lua для VScode
Рекомендуется использовать везде SD режим при разработке, это значительно повышает скорость тестов