В данном гайде я восстановлю тему которую делал 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); добавляем новые строчки:
(Тут думаю все понятно, первая строчка - сама анимация телефона в руке, вторая - создаем объект телефона в руке у игрока на определенных координатах.)
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"); добавляем этот код:
6.Также ниже находим строчку public static async Task CloseAsync(Client client, bool hidePhone = true) и добавляем туда такие же строчки удаления анимации и объекта телефона из рук.
В итоге, если вы сделали все верно, должно получиться вот так:
1. Достаем телефон
2. Убираем телефон
Годная тема, думаю есть вам смысл отблагодарить Харланда активностью на форуме
Странно что он не восстановил ее сам.
Приступим:
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);
В итоге, если вы сделали все верно, должно получиться вот так:
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
Все флаги запуска анимации:
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
Годная тема, думаю есть вам смысл отблагодарить Харланда активностью на форуме
Последнее редактирование модератором: