Мануал Добавляем анимацию "телефон в руке" - мод RedAge RolePlay (NeptuneEvo)

2pac

Активный участник
Автор темы
high coder
35
18
27
В данном гайде я восстановлю тему которую делал Harland до слета БД, по просьбе челиков в чате.

Странно что он не восстановил ее сам🙃.

Приступим:

1. Открываем NeptuneEvo\GUI\Menu.cs.
2. Ищем по файлу (ctrl+f) строчку public static void Open(Client client, Menu menu, bool force = false).
(В данной функции игроку показывается телефон, сюда нам и нужно добавить сам телефон в руку и использовать анимацию на игрока.)
3. После строчки Trigger.ClientEvent(client, "phoneOpen", data); добавляем новые строчки:
C#:
Main.OnAntiAnim(client);
client.PlayAnimation("anim@cellphone@in_car@ds", "cellphone_text_read_base", 49); // Анимация взгляда в телефон для персонажа
Core.BasicSync.AttachObjectToPlayer(client, NAPI.Util.GetHashKey("prop_amb_phone"), 6286, new Vector3(0.06, 0.01, -0.02), new Vector3(80, -10, 110)); // Привязываем объект к руке
(Тут думаю все понятно, первая строчка - сама анимация телефона в руке, вторая - создаем объект телефона в руке у игрока на определенных координатах.)
4. Но это еще не все, в том же файле чуть ниже находим строчку public static async Task OpenAsync(Client client, Menu menu, bool force = false) и добавляем туда такие же строчки анимации и объекта в руке. Все тоже самое, только функция другая.
5. Мы уже на половине пути... Осталось убрать анимацию и объект из руки персонажа в момент закрытия телефона. В том же файле находим строчку public static void Close(Client client, bool hidePhone = true) и после строки Trigger.ClientEvent(client, "phoneClose"); добавляем этот код:
C#:
if (!client.IsInVehicle) client.StopAnimation();

client.ResetData("AntiAnimDown");
if (client.IsInVehicle) client.SetData("ToResetAnimPhone", true);

Core.BasicSync.DetachObject(client);
6.Также ниже находим строчку public static async Task CloseAsync(Client client, bool hidePhone = true) и добавляем туда такие же строчки удаления анимации и объекта телефона из рук.


В итоге, если вы сделали все верно, должно получиться вот так:
1. Достаем телефон
C#:
public static void Open(Client client, Menu menu, bool force = false)
        {
            try
            {
                if (Menus.ContainsKey(client.Handle))
                {
                    Log.Debug($"Client already have opened Menu! id:{Menus[client.Handle].ID}", nLog.Type.Warn);
                    if (!force) return;
                    Menus.Remove(client.Handle);
                }
                Menus.Add(client.Handle, menu);

                //string data = JsonConvert.SerializeObject(menu);
                string data = menu.getJsonStr();

                if (!client.HasData("Phone"))
                {
                    Trigger.ClientEvent(client, "phoneShow");
                    client.SetData("Phone", true);
                }
                Trigger.ClientEvent(client, "phoneOpen", data);
                Main.OnAntiAnim(client);
                client.PlayAnimation("anim@cellphone@in_car@ds", "cellphone_text_read_base", 49);
                Core.BasicSync.AttachObjectToPlayer(client, NAPI.Util.GetHashKey("prop_amb_phone"), 6286, new Vector3(0.06, 0.01, -0.02), new Vector3(80, -10, 110));
            } catch(Exception e)
            {
                Log.Write("EXCEPTION AT \"MENUCONTROL_OPEN\":\n" + e.ToString(), nLog.Type.Error);
            }
        }
2. Убираем телефон
C#:
public static void Close(Client client, bool hidePhone = true)
        {
            try
            {
                if (Menus.ContainsKey(client.Handle))
                    Menus.Remove(client.Handle);
                if (hidePhone)
                {
                    Trigger.ClientEvent(client, "phoneHide");
                    client.ResetData("Phone");
                }
                Trigger.ClientEvent(client, "phoneClose");

                if (!client.IsInVehicle) client.StopAnimation();

                client.ResetData("AntiAnimDown");
                if (client.IsInVehicle) client.SetData("ToResetAnimPhone", true);

                Core.BasicSync.DetachObject(client);

            } catch (Exception e)
            {
                Log.Write("EXCEPTION AT \"MENUCONTROL_CLOSE\":\n" + e.ToString(), nLog.Type.Error);
            }
        }
В функции PlayAnimation в конце есть число 49, это флаги анимации.

Все флаги запуска анимации:
NORMAL = 0,
REPEAT = 1,
STOP_LAST_FRAME = 2,
UPPERBODY = 16,
ENABLE_PLAYER_CONTROL = 32,
CANCELABLE = 120,
Odd number : loop infinitely
Even number : Freeze at last frame
Multiple of 4: Freeze at last frame but controllable
01 to 15 : Full body
10 to 31 : Upper body
32 to 47 : Full body > Controllable
48 to 63 : Upper body > Controllable
001 to 255 : Normal
256 to 511 : Garbled

Список всех анимаций - Список всех анимаций GTA V (+ Animation Viewer). https://wiki.gtanet.work/index.php?title=Animations
Очень удобный ресурс для просмотра объектов в 3D - Список объектов с просмотром в 3D. https://mwojtasik.dev/tools/gtav/objects

Годная тема, думаю есть вам смысл отблагодарить Харланда активностью на форуме 🙃
 
Последнее редактирование модератором:

Harland David Sanders

Куратор портала
Команда форума
Куратор портала
194
80
57
Это первая версия анимации, она обрывистая.
Есть новая версия она плавнее + есть анимка как убирается телефон.

Пару лайков на этот пост и выложу. :devilish:
 

2pac

Активный участник
Автор темы
high coder
35
18
27
Это первая версия анимации, она обрывистая.
Есть новая версия она плавнее + есть анимка как убирается телефон.

Пару лайков на этот пост и выложу. :devilish:
Ну Давай, типы просили в чате я не просто же так сделал
 

Harland David Sanders

Куратор портала
Команда форума
Куратор портала
194
80
57
Плавная анимация телефона (only client):


JavaScript:
// Создаем телефон, достаем его и смотрим
mp.game.mobile.createMobilePhone(3);
mp.game.mobile.setMobilePhoneScale (0);
mp.game.mobile.scriptIsMovingMobilePhoneOffscreen(false);
mp.game.mobile.setPhoneLean(false);
JavaScript:
// Удаляем телефон
mp.game.invoke ('0x3BC861DF703E5097', mp.players.local.handle, true);
 
Последнее редактирование:

Crazy_Man

Участник портала
16
2
12
Плавная анимация телефона (only client):


JavaScript:
// Создаем телефон, достаем его и смотрим
mp.game.mobile.createMobilePhone(3);
mp.game.mobile.setMobilePhoneScale (0);
mp.game.mobile.scriptIsMovingMobilePhoneOffscreen(false);
mp.game.mobile.setPhoneLean(false);
JavaScript:
// Удаляем телефон
mp.game.invoke ('0x3BC861DF703E5097', mp.players.local.handle, true);
Его куда забросить в index.js?
 

Harland David Sanders

Куратор портала
Команда форума
Куратор портала
194
80
57

Harland David Sanders

Куратор портала
Команда форума
Куратор портала
194
80
57

Crazy_Man

Участник портала
16
2
12
Нет, в сервере не надо.
может немного не по этой теме, можешь подсказать я сменил стоимость поставки в Дальнобойщике с 2000к на 5000к а в телефоне заказ светиться за 2000к где его еще нужно изменить, я так понял в клиенткой базе где-то?!
 

Harland David Sanders

Куратор портала
Команда форума
Куратор портала
194
80
57
может немного не по этой теме, можешь подсказать я сменил стоимость поставки в Дальнобойщике с 2000к на 5000к а в телефоне заказ светиться за 2000к где его еще нужно изменить, я так понял в клиенткой базе где-то?!
В базе данных.
 

Crazy_Man

Участник портала
16
2
12
короче не работает этот новый телефон, а тот что 2pас выложил все норм
 
Последнее редактирование:

Harland David Sanders

Куратор портала
Команда форума
Куратор портала
194
80
57

wearnings

Участник портала
VIP
14
1
12
25
короче не работает этот новый телефон, а тот что 2pас выложил все норм
// Достаем телефон и закрываем.
mp.keys.bind(Keys.VK_M, false, function () { // M key
// Создаем телефон, достаем его и смотрим
mp.game.mobile.createMobilePhone(3);
mp.game.mobile.setMobilePhoneScale (0);
mp.game.mobile.scriptIsMovingMobilePhoneOffscreen(false);
mp.game.mobile.setPhoneLean(false);
// Удаляем телефон
mp.game.invoke ('0x3BC861DF703E5097', mp.players.local.handle, true);
if (!loggedin || chatActive || editing || global.menuCheck() || cuffed || localplayer.getVariable('InDeath') == true) return;
mp.events.callRemote('openPlayerMenu');
lastCheck = new Date().getTime();
});
 

Crazy_Man

Участник портала
16
2
12
// Достаем телефон и закрываем.
mp.keys.bind(Keys.VK_M, false, function () { // M key
// Создаем телефон, достаем его и смотрим
mp.game.mobile.createMobilePhone(3);
mp.game.mobile.setMobilePhoneScale (0);
mp.game.mobile.scriptIsMovingMobilePhoneOffscreen(false);
mp.game.mobile.setPhoneLean(false);
// Удаляем телефон
mp.game.invoke ('0x3BC861DF703E5097', mp.players.local.handle, true);
if (!loggedin || chatActive || editing || global.menuCheck() || cuffed || localplayer.getVariable('InDeath') == true) return;
mp.events.callRemote('openPlayerMenu');
lastCheck = new Date().getTime();
});
если бы ты указал путь куда забросить было бы норм, а то я себе закинул и не фуричит
 

Etader

Участник портала
32
4
17
там косяк в авто если достаешь-он едит с поднятой рукой
 
  • Like
Реакции: Supreme