Animacje i rekwizyty FiveM: flagi TaskPlayAnim, dołącz do kości, usuń

Graj animacje i dołączaj rekwizyty w Lua FiveM: RequestAnimDict, flagi TaskPlayAnim 1, 16, 32 i 49, ClearPedTasks, AttachEntityToEntity do kości, scenariusze i czyszczenie.

Chcesz, aby gracz pił kawę, trzymał telefon lub używał narzędzia: animacja, często z rekwizytami w dłoni. Zrobione źle, animacja nic nie robi, rekwizyt pływa u stóp gracza lub zostaje na świecie wiecznie. Ten przewodnik pokazuje pracującą sekwencję i czyszczenie.

Załaduj, graj, wyczyść

Animacja mieszka w słowniku. Słownik musi być załadowany, zanim grasz z niego:

lua
local function playAnim(ped, dict, anim, flag, duration)
    RequestAnimDict(dict)
    while not HasAnimDictLoaded(dict) do
        Wait(0)
    end
    TaskPlayAnim(ped, dict, anim, 8.0, -8.0, duration or -1, flag or 0, 0.0, false, false, false)
end

Jeśli HasAnimDictLoaded nigdy nie będzie prawdziwy, nazwa słownika jest zła i ta pętla wisi, więc dodaj timeout, gdy nazwa pochodzi z konfiguracji. Za ox_lib, jedna linia zastępuje pętlę:

lua
lib.requestAnimDict('mp_player_inteat@burger')

TaskPlayAnim bierze peda, słownik, animację, blend in, blend out, czas trwania w ms (-1 = aż do zatrzymania), flaga, i szybkość odtwarzania. Zwolnij słownik, gdy skończysz z RemoveAnimDict(dict).

Flagi animacji

Flaga to maska bitowa, więc wartości się dodają. Te, które będziesz używać:

Flaga Efekt
0 Graj raz, gracz nie może się poruszać
1 Pętla
16 Tylko górna część ciała, nogi trzymają chodzenie
32 Gracz zachowuje kontrolę
49 1 + 16 + 32: pętla, górna część ciała, kontrolowalna

Dla animacji trzymanej w ręce (telefon, napój, papieros), 49 to zwykły wybór: pętli, tylko górna część ciała jest animowana, i gracz może się poruszać. Dla akcji jednorazowej, gdzie gracz powinien stać w bezruchu, użyj 0, lub 1 jeśli powinna pętlować.

Zatrzymanie animacji

lua
local ped = PlayerPedId()
ClearPedTasks(ped)                 -- stop and let the ped blend out
-- or, if it is stuck:
ClearPedTasksImmediately(ped)      -- cut instantly, can look abrupt
StopAnimTask(ped, dict, anim, 1.0) -- stop only that animation

Użyj StopAnimTask, gdy kilka rzeczy działa na pedie, ponieważ ClearPedTasks również anuluje chodzenie lub scenariusz pod spodem. ClearPedTasksImmediately naprawia peła uzasadnionego, ale także wysysa je z pojazdów, więc trzymaj to do odzyskania.

Rekwizyt w dłoni

Rekwizyt to obiekt, który tworzysz i dołączasz do kości peda. Sekwencja: załaduj model, stwórz obiekt, dołącz, graj animację.

lua
local prop

local function attachProp(ped, model, bone, x, y, z, rx, ry, rz)
    local hash = joaat(model)
    RequestModel(hash)
    while not HasModelLoaded(hash) do Wait(0) end

    local coords = GetEntityCoords(ped)
    prop = CreateObject(hash, coords.x, coords.y, coords.z + 0.2, true, true, false)

    AttachEntityToEntity(
        prop, ped, GetPedBoneIndex(ped, bone),
        x, y, z, rx, ry, rz,
        true, true, false, true, 1, true
    )
    SetModelAsNoLongerNeeded(hash)
    return prop
end

Części:

  • CreateObject(model, x, y, z, isNetwork, netMissionEntity, doorFlag): podaj isNetwork = true, jeśli inni gracze powinni widzieć rekwizyt, co zwykle jest tym, czego chcesz dla czegoś w dłoni.
  • GetPedBoneIndex(ped, boneId) konwertuje id kości, takie jak 28422 (umieszczenie prawej ręki) lub 18905 (lewa ręka) do indeksu. Szukaj listy id kości dla innych.
  • x, y, z i rx, ry, rz to przesunięcia i obrót względem kości. Te muszą być dostrojone na rekwizyt; nie ma skrótu, więc zmień wartość i testuj.
  • Wartości logiczne po rotacji to miękkie przypięcie, kolizja i podobne flagi. Kolizja false zapobiega rekwizytowi wypychającemu peda.

Połącz to razem

lua
local function eatBurger()
    local ped = PlayerPedId()
    attachProp(ped, 'prop_cs_burger_01', 28422, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0)
    lib.requestAnimDict('mp_player_inteat@burger')
    TaskPlayAnim(ped, 'mp_player_inteat@burger', 'mp_player_int_eat_burger', 8.0, -8.0, 3000, 49, 0.0, false, false, false)
    Wait(3000)
    ClearPedTasks(ped)
    deleteProp()
end

Jeśli rekwizyt wygląda źle w dłoni, najpierw napraw przesunięcia, potem kość. Jeśli inna nazwa animacji nie istnieje w słowniku, TaskPlayAnim po cichu nic nie robi, więc dokładnie sprawdź parę (dokładne nazwy słownika i animacji, małe litery tak jak napisane).

Usuń rekwizyt

Zawsze czyść. Rekwizyt, który nie jest usunięty, pozostaje na świecie, wciąż dołączony do peda, który go już nie trzyma:

lua
function deleteProp()
    if prop and DoesEntityExist(prop) then
        DetachEntity(prop, true, true)
        DeleteEntity(prop)
    end
    prop = nil
end

AddEventHandler('onResourceStop', function(resource)
    if resource ~= GetCurrentResourceName() then return end
    deleteProp()
    ClearPedTasks(PlayerPedId())
end)

Również usuń rekwizyt na śmierć i gdy gracz opuszcza animację, nie tylko na szczęśliwej ścieżce. Wyciekłe rekwizyty to klasyczne źródło « obiektów wszędzie » i powolnego serwera; patrz resmon high ms.

Scenariusze

W przypadku stojących animacji, które zawierają swoje własne rekwizyty, takie jak pochylanie, palenie lub pisanie na schowku, zamiast tego użyj scenariusza:

lua
local ped = PlayerPedId()
TaskStartScenarioInPlace(ped, 'WORLD_HUMAN_CLIPBOARD', 0, true)

-- later
ClearPedTasks(ped)

Argumenty to ped, nazwa scenariusza, opóźnienie w ms (0 dla żadnego) i czy grać animację wejścia. Scenariusze dołączają i czyszczą swój rekwizyt za ciebie, i są najłatwiejsze, gdy animacja nie musi być trzymana podczas chodzenia.

Aby uzyskać gotową wersję animacji plus rekwizyt plus pasek postępu, lib.progressBar ox_lib akceptuje opcje anim i prop; patrz notifications and progress bars i Wait and threads dla nawyków czekania za pętlami powyżej.

Lista kontrolna

Objaw Naprawa
Animacja nic nie robi Poproś o słownik i czekaj na HasAnimDictLoaded najpierw
Pętla wisi w ładowaniu Nazwa słownika jest zła; dodaj timeout
Gracz zamrożony w miejscu Flaga 0 lub 1 blokuje ruch; użyj 49 aby zachować kontrolę
Rekwizyt u stóp, a nie w ręce Zła kość lub brak AttachEntityToEntity; sprawdź GetPedBoneIndex
Rekwizyt skrzywiony w dłoni Dostrój x, y, z i przesunięcia obrotu
Rekwizyty pozostawione na świecie DeleteEntity(prop) na końcu, śmierci i zatrzymaniu zasobu
Ped utknął w pozycji ClearPedTasks lub, jako ostatnia instancja, ClearPedTasksImmediately

Szybkie odpowiedzi

Dlaczego moja animacja się nie gra?

Słownik animacji nie został jeszcze załadowany. Wezwij RequestAnimDict, czekaj aż HasAnimDictLoaded będzie prawdziwy, i dopiero wtedy wezwij TaskPlayAnim. Za pomocą ox_lib, lib.requestAnimDict(dict) to robi za ciebie.

Którą flagę TaskPlayAnim powinienem używać?

Użyj 1 do pętli, 16 aby grać tylko na górze ciała, 32 aby pozwolić graczowi zachować kontrolę, i 49 dla pętli plus górna część ciała plus kontrolowalna. Są to wspólne kombinacje dla animacji, które trzymasz podczas chodzenia.

Jak usunąć rekwizyt po animacji?

Wezwij DeleteEntity(prop), gdy animacja się skończy lub skrypt się zatrzyma, i zwolnij model za SetModelAsNoLongerNeeded. Rekwizyty pozostawione za sobą piętrzą się na świecie.

Skrypty bez tego problemu

Hookah SystemFajki wodne i meble lounge do rozstawienia, z ponad 50 smakami i efektami.Zobacz skrypt →Vape SystemPonad 50 e-papierosów ze smakami, dymem i efektami — od mango po super prędkość.Zobacz skrypt →Super Leaf BlowerDmuchawa do liści, która odpycha graczy, auta, NPC i propy. Działa na każdym frameworku.Zobacz skrypt →

Czytaj dalej