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:
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)
endJeś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ę:
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
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 animationUż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ę.
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
endCzęści:
CreateObject(model, x, y, z, isNetwork, netMissionEntity, doorFlag): podajisNetwork = 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 jak28422(umieszczenie prawej ręki) lub18905(lewa ręka) do indeksu. Szukaj listy id kości dla innych.x, y, zirx, ry, rzto 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
falsezapobiega rekwizytowi wypychającemu peda.
Połącz to razem
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()
endJeś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:
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:
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 →