FiveM animasyonları ve sahne öğeleri: TaskPlayAnim bayrakları, kemik takma, silme

FiveM Lua'da animasyonları oynat ve sahne öğelerini ekle: RequestAnimDict, TaskPlayAnim bayrakları 1, 16, 32 ve 49, ClearPedTasks, AttachEntityToEntity bir kemike, senaryolar ve temizlik.

Oyuncu kahve içmek, telefon tutmak veya bir aracı kullanmak istiyorsunuz: bir animasyon, çoğu zaman eldeki bir sahne öğesiyle. Yanlış yapılırsa, animasyon hiçbir şey yapmaz, sahne öğesi oyuncunun ayaklarının dibinde yüzer veya dünyada sonsuza kadar kalır. Bu rehber çalışan sırayı ve temizliği gösterir.

Yükle, oynat, temizle

Bir animasyon bir sözlük içinde yaşar. Ondan oynatmadan önce sözlük yüklenmeli:

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

HasAnimDictLoaded hiçbir zaman true değilse, sözlük adı yanlıştır ve bu döngü asılı kalır, bu nedenle ad yapılandırmadan gelirse bir zaman aşımı ekleyin. ox_lib ile, bir satır döngüyü değiştirir:

lua
lib.requestAnimDict('mp_player_inteat@burger')

TaskPlayAnim ped, sözlük, animasyon, karışım içinde, karışım çıkış, milisaniye cinsinden süre (-1 = durdurulana kadar), bayrak ve oynatma hızını alır. RemoveAnimDict(dict) ile bitirdiğinizde sözlüğü serbest bırakın.

Animasyon bayrakları

Bayrak bir bitmask olduğundan değerler toplanır. Kullanacağınız olanlar:

Bayrak Etki
0 Bir kez oynat, oyuncu hareket edemez
1 Döngü
16 Yalnızca üst gövde, bacaklar yürümeye devam ediyor
32 Oyuncu kontrol ediyor
49 1 + 16 + 32: döngü, üst gövde, kontrol edilebilir

Elde tutulan animasyon (telefon, içecek, sigara) için, 49 genellikle tercih edilen seçimdir: döngü yapar, sadece üst gövde animasyonludur ve oyuncu yine de yürüyebilir. Oyuncunun hareketsiz kalması gereken bir kez gerçekleşen eylem için, döngü yapması gerekirse 0 veya 1 kullanın.

Animasyonu durdurma

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

Ped'de birkaç şey çalışırken StopAnimTask kullanın, çünkü ClearPedTasks yürümeyi veya altındaki senaryoyu da iptal eder. ClearPedTasksImmediately sıkışmış bir ped'i düzeltir ama ayrıca araçlardan çıkartır, bu nedenle kurtarma için saklayın.

Eldeki sahne öğesi

Sahne öğesi, oluşturduğunuz ve ped'in kemiğine takıdığınız bir nesnedir. Sıra: modeli yükle, nesneyi oluştur, takı, animasyonu oynat.

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

Parçalar:

  • CreateObject(model, x, y, z, isNetwork, netMissionEntity, doorFlag): isNetwork = true geçirin eğer diğer oyuncular sahne öğesini görmeli ise, bu genellikle elde bir şey için istenen şeydir.
  • GetPedBoneIndex(ped, boneId) kemik kimliğini 28422 (sağ el yerleştirmesi) veya 18905 (sol el) gibi bir indekse dönüştürür. Diğerleri için kemik kimliği listesine bakın.
  • x, y, z ve rx, ry, rz kemik göreceli ofsetler ve rotasyondur. Bunlar sahne öğe başına ayarlamaya ihtiyaç duyar; kısayol yoktur, bu nedenle bir değeri değiştirin ve test edin.
  • Boolean'lar rotasyondan sonra yumuşak sabitleme, çarpışma ve benzer bayraklardır. Çarpışma false sahne öğesinin ped'i etrafında itmesini engeller.

Parçaları bir araya koyun

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

Sahne öğesi elinde yanlış görünüyorsa, önce ofsetleri, ardından kemiği düzeltin. Diğer animasyon adı bir sözlükte yoksa, TaskPlayAnim sessizce hiçbir şey yapmaz, bu nedenle çifti iki kez kontrol edin (tam sözlük ve animasyon adları, yazıldığı gibi küçük harf).

Sahne öğesini sil

Her zaman temizleyin. Silinmeyen sahne öğesi dünyada kalır, onu artık tutmayan ped'e takılı olarak:

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)

Ayrıca animasyondan çıktığında ve oyuncu ayrıldığında sahne öğesini silin, sadece mutlu yolda değil. Sızan sahne öğeleri "her yerde nesneler" ve yavaş sunucunun klasik kaynağıdır; bkz. resmon yüksek ms.

Senaryolar

Kendi sahne öğelerini içeren, eğilme, sigara içme veya pano yazma gibi duran animasyonlar için, bunun yerine senaryo kullanın:

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

-- later
ClearPedTasks(ped)

Argümanlar ped, senaryo adı, milisaniye cinsinden gecikme (hiçbiri için 0) ve giriş animasyonunu oynatıp oynatmama olur. Senaryolar sahne öğesini sizin için ekle ve temizler, ve animasyon yürürken tutulması gerekmediğinde en kolay seçimdir.

Animasyon artı sahne öğesi artı ilerleme çubuğunun hazır yapılmış sürümü için, ox_lib'in lib.progressBar anim ve prop seçeneklerini kabul eder; bkz. bildirimler ve ilerleme çubukları ve Bekle ve iş parçacıkları yukarıdaki döngülerin arkasındaki bekleme alışkanlıkları için.

Kontrol Listesi

Belirtisi Düzeltme
Animasyon hiçbir şey yapmıyor Sözlüğü isteyin ve HasAnimDictLoaded bekleyin
Döngü yüklemede asılı kalıyor Sözlük adı yanlış; zaman aşımı ekleyin
Oyuncu yerde donmuş Bayrak 0 veya 1 hareketi engeller; kontrol tutmak için 49 kullanın
Sahne öğesi ayakta, ele değil Yanlış kemik veya AttachEntityToEntity yok; GetPedBoneIndex kontrol edin
Sahne öğesi elde çarpık x, y, z ve rotasyon ofsetlerini ayarlayın
Dünyada bırakılan sahne öğeleri Sonunda DeleteEntity(prop), ölüm ve kaynak durması
Ped bir pozda sıkışmış ClearPedTasks veya son çare olarak ClearPedTasksImmediately

Kısa yanıtlar

Animasyonum neden oynatılmıyor?

Animasyon sözlüğü henüz yüklenmedi. RequestAnimDict çağırın, HasAnimDictLoaded true olana kadar bekleyin ve ancak o zaman TaskPlayAnim çağırın. ox_lib ile, lib.requestAnimDict(dict) bunu sizin için yapar.

Hangi TaskPlayAnim bayrağını kullanmalıyım?

Döngü yapmak için 1, yalnızca üst gövde için 16, oyuncunun kontrol tutmasını sağlamak için 32 ve döngü artı üst gövde artı kontrol edilebilir için 49 kullanın. Bunlar yürürken tuttuğunuz animasyonlar için ortak kombinasyonlardır.

Animasyondan sonra sahne öğesini nasıl kaldırırım?

Animasyon bittiğinde veya betik durduğunda DeleteEntity(prop) çağırın ve modeli SetModelAsNoLongerNeeded ile serbest bırakın. Geride bırakılan sahne öğeleri dünyada yığılır.

Bu sorunu yaşatmayan scriptler

Hookah SystemYerleştirilebilir nargileler ve lounge mobilyaları; 50+ aroma ve efekt.Scripti gör →Vape SystemAroma, duman ve efektleriyle 50+ vape — mangodan süper hıza.Scripti gör →Super Leaf BlowerOyuncuları, araçları, NPC’leri ve propları iten bir yaprak üfleyici. Her framework’te çalışır.Scripti gör →

Okumaya devam edin