• Из-за обновления GTA 5 (был добавлен новый патч) может временно не работать вход в RAGE Multiplayer.

    ERROR: Your game version is not supported by RAGE Multiplayer.

    Данная ошибка говорит о том, что GTA V обновилась до новой версии (GTA Online тоже). Вам необходимо обновить саму игру в главном меню вашего приложения (Steam / Epic Games / Rockstar Games).
    Если после этого RAGE:MP все равно не работает - вам нужно дождаться выхода патча для самого мультиплеера (обычно это занимает от нескольких часов до нескольких дней).

    Новости и апдейты Rockstar Games - https://www.rockstargames.com/ru/newswire/
    Статус всех служб для Rockstar Games Launcher и поддерживаемых игр: https://support.rockstargames.com/ru/servicestatus


    Grand Theft Auto 5 (+ GTA Online) последний раз были обновлены:

Синхронизация анимаций

frytech

Начинающий специалист
Автор темы
15 Янв 2022
128
17
53
Сделал синхронизацию анимаций, если игрок находится в зоне стрима, то все ок работает. Но если один игрок использует анимацию и другой входит в его зону стрима, то у второго анимация не срабатывает (TaskPlayAnim выполняется, но не срабатывает сама анимка). Может кто-то знает, возможно что то надо сделать дополнительно с player когда он попадает в зону стрима?
Все остальное так же работает, вот только синхра анимок - нет.
 

XDeveluxe

Модератор
Команда форума
high coder
30 Авг 2021
2,220
1,425
191
27
Если всё так, как ты описал (TaskPlayAnim выполняется, но анимаци не воспроизводится), то полагаю, что на клиенте у тебя нет подгрузки директории анимации до их использования.
Пробуй подгружать их раньше, чем используешь.

JavaScript:
if (mp.game.streaming.hasAnimDictLoaded(animDictionary)) return;
mp.game.streaming.requestAnimDict(animDictionary);
 

frytech

Начинающий специалист
Автор темы
15 Янв 2022
128
17
53
Если всё так, как ты описал (TaskPlayAnim выполняется, но анимаци не воспроизводится), то полагаю, что на клиенте у тебя нет подгрузки директории анимации до их использования.
Пробуй подгружать их раньше, чем используешь.

JavaScript:
if (mp.game.streaming.hasAnimDictLoaded(animDictionary)) return;
mp.game.streaming.requestAnimDict(animDictionary);
Так и делаю. В зоне стрима все работает, а вот если игрок только-только попадает в зону стрима, то анимация не проигрывается. Не знаю уже, что делать :(
 

XDeveluxe

Модератор
Команда форума
high coder
30 Авг 2021
2,220
1,425
191
27
Так и делаю. В зоне стрима все работает, а вот если игрок только-только попадает в зону стрима, то анимация не проигрывается. Не знаю уже, что делать :(
Возможно потому что персонаж еще не успел обрести handle, попробуй сделать таймаут на какое-то время.
 

frytech

Начинающий специалист
Автор темы
15 Янв 2022
128
17
53
Возможно потому что персонаж еще не успел обрести handle, попробуй сделать таймаут на какое-то время.
Тоже об этом думал, спасибо, попробую

Но все равно странно, Attach то работает
 

frytech

Начинающий специалист
Автор темы
15 Янв 2022
128
17
53
Да, не помогло. Ну с другой стороны оно и логично, AttacEntityToEntity ведь срабатывает, а вот анимка нет (TaskPlayAnim).
Может при входе игрока в стрим надо не TaskPlayAnim использовать, а другую команду?
 

frytech

Начинающий специалист
Автор темы
15 Янв 2022
128
17
53
Проблема так и не решилась, то же самое и с Attach при stream in. Заметил, что если добавить задержку перед тем как анимку проигрывать при streamin или же аттач делать, то все работает. Но зависит не сколько от задержки, сколько от расстояния до игрока. Даже если он уже попал в зону стрима, ты должен еще ближе быть к игроку, как это детектить я пока не понял.
 
Последнее редактирование:

dooj

Гуру
high coder
24 Мар 2022
460
166
100
Посмотри, может это поможет тебе. (функция отыскивает игрока рядом по заданному радиусу)
JavaScript:
let entity = closestPlayer(1)

function closestPlayer(radius) {
    let inRange = [];
    let player = global.LPlayer
    let target = false;
    mp.players.forEach((_player) => {
        if(_player === player) return false;
        if(!_player.handle) return false;
        let distance = mp.game.gameplay.getDistanceBetweenCoords(_player.position.x, _player.position.y, _player.position.z, global.LPlayer.position.x, global.LPlayer.position.y, global.LPlayer.position.z, true);
        if(distance > parseFloat(radius)) return false;
        inRange.push({"remoteId": _player.remoteId, "distance": distance});
        target = _player
    });
    if(inRange.length) {
        inRange.sort(function(a, b) {
            return a.distance-b.distance
        });
    }
    return target;
}
 

XDeveluxe

Модератор
Команда форума
high coder
30 Авг 2021
2,220
1,425
191
27
Проблема так и не решилась, то же самое и с Attach при stream in. Заметил, что если добавить задержку перед тем как анимку проигрывать при streamin или же аттач делать, то все работает. Но зависит не сколько от задержки, сколько от расстояния до игрока. Даже если он уже попал в зону стрима, ты должен еще ближе быть к игроку, как это детектить я пока не понял.
Повторюсь, ошибка на твоей стороне.
На моём проекте прорисовка анимации работает при entityStreamIn тем методом, что я описал выше.
Что-то ты делаешь не так.
 

frytech

Начинающий специалист
Автор темы
15 Янв 2022
128
17
53
Посмотри, может это поможет тебе. (функция отыскивает игрока рядом по заданному радиусу)
JavaScript:
let entity = closestPlayer(1)

function closestPlayer(radius) {
    let inRange = [];
    let player = global.LPlayer
    let target = false;
    mp.players.forEach((_player) => {
        if(_player === player) return false;
        if(!_player.handle) return false;
        let distance = mp.game.gameplay.getDistanceBetweenCoords(_player.position.x, _player.position.y, _player.position.z, global.LPlayer.position.x, global.LPlayer.position.y, global.LPlayer.position.z, true);
        if(distance > parseFloat(radius)) return false;
        inRange.push({"remoteId": _player.remoteId, "distance": distance});
        target = _player
    });
    if(inRange.length) {
        inRange.sort(function(a, b) {
            return a.distance-b.distance
        });
    }
    return target;
}
Спасибо за попытку помочь, но это не то, да и до такого я бы и сам догадался. Там прикол в том, что фиг поймешь, какой радиус нужен)
 
  • Like
Реакции: dooj

frytech

Начинающий специалист
Автор темы
15 Янв 2022
128
17
53
Повторюсь, ошибка на твоей стороне.
На моём проекте прорисовка анимации работает при entityStreamIn тем методом, что я описал выше.
Что-то ты делаешь не так.
Ну каким образом у меня может быть ошибка, если я все перепроверил миллиард раз?) Там даже для теста сделал бинд на кнопку, чтобы анимку проигрывать у челика, при входе в зону стрима этого челика метод этот и так выполняется, да ничего не происходит, а если я через время, даже незначительное, нажму на этот бинд и приближусь к челу, чтобы проверить анимку, то все работает. Там надо задержку подбирать походу, хз уже.

P.S. Даже на чистом проекте проверил, где ничего кроме анимки при streamIn нет - то же самое поведение
 

frytech

Начинающий специалист
Автор темы
15 Янв 2022
128
17
53
Нашел золотую середину походу, 2500ms в streamIn задержка перед тем, как анимки проигрывать или аттач делать и все работает отлично. Вообще без понятия, с чем это связано, лучше бы конечно, если бы метод был какой нибудь, который определяет, готов пед к анимке или же нет
 

XDeveluxe

Модератор
Команда форума
high coder
30 Авг 2021
2,220
1,425
191
27
P.S. Даже на чистом проекте проверил, где ничего кроме анимки при streamIn нет - то же самое поведение
Ну значит я пиздабол, получается.
1656236420888.png


requestAnimDict - кастомный Promise, который возвращает resolve(true) в случае, если анимация прогружена с помощью рейджовского requestAnimDict. Если нет - ожидает её какое-то время и только тогда возвращает. Но ладно, не работает - не делай, но у меня "почему-то" всё работает.
 
Последнее редактирование:
  • Haha
Реакции: Harland David Sanders

frytech

Начинающий специалист
Автор темы
15 Янв 2022
128
17
53
Ну значит я пиздабол, получается.
Посмотреть вложение 4417

requestAnimDict - кастомный Promise, который возвращает resolve(true) в случае, если анимация прогружена с помощью рейджовского requestAnimDict. Если нет - ожидает её какое-то время и только тогда возвращает. Но ладно, не работает - не делай, но у меня "почему-то" всё работает.
У меня используется такая структура, я же писал уже. Если бы у меня ее не было, то анимка бы не работала вообще, даже когде проигрывается уже в зоне стрима. И я сказал, что не знаю, с чем это связано, но нужна небольшая задержка перед тем как именно в streamIn аттачить или проигрывать анимку. С ней все работает хорошо, как мне и нужно было.
1656237714905.png
1656237741942.png
 

frytech

Начинающий специалист
Автор темы
15 Янв 2022
128
17
53
Возможно, это приколюхи бриджа на C#, не знаю, я не говорил, что ты пиздабол, я сказал, что у меня так)
 

frytech

Начинающий специалист
Автор темы
15 Янв 2022
128
17
53
Так же и с Attach при streamIn, ставлю 2500 задержку - все всегда аттачится и все ок, а если без нее, то через раз, то аттачит, то нет, в зависимости от скорости, когда я приближусь к игроку, который попал в зону стрима
1656238146879.png
 

XDeveluxe

Модератор
Команда форума
high coder
30 Авг 2021
2,220
1,425
191
27
У меня используется такая структура, я же писал уже. Если бы у меня ее не было, то анимка бы не работала вообще, даже когде проигрывается уже в зоне стрима. И я сказал, что не знаю, с чем это связано, но нужна небольшая задержка перед тем как именно в streamIn аттачить или проигрывать анимку. С ней все работает хорошо, как мне и нужно было.
Посмотреть вложение 4419Посмотреть вложение 4420
Сделай async Task и замени на WaitAsync, а в ивенте ОЖИДАЙ ответа от RequestAnimDict, а не так, как сделано у тебя.
Повторюсь, если у меня работает так, а у тебя нет - делай выводы. То, как ты сделал - не единственный возможный вариант исполнения.
 

frytech

Начинающий специалист
Автор темы
15 Янв 2022
128
17
53
Сделай async Task и замени на WaitAsync, а в ивенте ОЖИДАЙ ответа от RequestAnimDict, а не так, как сделано у тебя.
Повторюсь, если у меня работает так, а у тебя нет - делай выводы. То, как ты сделал - не единственный возможный вариант исполнения.
У requestAnimDict на C# возвращаемый тип - void, его нельзя ожидать. Мой вариант, безусловно, не единственный возможный, но он логичный в том числе - все это исполняется в основном потоке, taskPlayAnim не выполнится до тех пор, пока не завершится метод подзагрузки анимки. Я уже вынес свое предположение, что дело в бридже, раз у тебя работает так при streamIn, а у меня нет. Я повторюсь, что такое происходит только при streamIn, в остальных случаях все работает и без задержки.
 

XDeveluxe

Модератор
Команда форума
high coder
30 Авг 2021
2,220
1,425
191
27
Прочитай еще раз моё сообщение, в котором я написал, что requestAnimDict на моём скриншоте - это КАСТОМНЫЙ метод, внутри которого уже происходит работа с обычным, рейджовским requestAnimDict, который тоже не ожидается, однако внутри кастомного всё тот же while, который отдаст true, когда всё будет готово или, через время, делаешь return false и тогда уже не отрисовываешь ничего.
В общем, всё, что я могу тебе сказать, что то, что ты сделал - можно изменить и мне кажется, что работать будет лучше, но если ты сделал выводы - дело твоё, просто варианты есть, но ты их не особо хочешь пробовать, так как не вчитываешься в моё сообщение.