testanim v2 + 0r_idcard qb-target + animations reference

- testanim refacut: suporta dict/anim/prop/bone/offsets/rotation
- 0r_idcard: migrat DrawText3D la qb-target + bubble 📸 la poza buletin
- Creat docs/animations_reference.md (animatii, props, bones, flags, state bags)
- Auto-oprire animatie anterioara la fiecare testanim
- Fisiere: 17mov_JobCenter/client/utils.lua, 0r_idcard/client/main.lua, docs/animations_reference.md
This commit is contained in:
2026-04-01 01:22:17 +03:00
parent 7a1f7f24eb
commit f2ea62d16c
7 changed files with 111 additions and 46 deletions

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

View File

@@ -29,6 +29,21 @@ git tkn: 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
### 📋 Rulebook Updates
- ✏️ Regula 13: Commit info (Summary + Description) după fiecare modificare
### 🎯 Migrare 0r_idcard → qb-target
- ✏️ `resources/[framework]/[addons]/0r_idcard/client/main.lua` — înlocuit DrawText3D + [E] cu qb-target
- NPC poza buletin: 📷 "Poza pentru buletin/ID" + animație mugshot + bubble 📸
- NPC act fals: 🪪 "Creeaza act fals"
- Eliminat while loop cu sleep (performanță mai bună)
### 🛠️ Testanim Tool (v2)
- ✏️ `17mov_JobCenter/client/utils.lua` — testanim refăcut complet:
- Suportă: `dict anim`, `dict anim propName`, `dict anim propName boneId`, `+ ox oy oz rx ry rz`
- Auto-oprește animația anterioară la fiecare apel
- Fără argumente = afișează help
### 📚 Animations Reference
- 🆕 `docs/animations_reference.md` — referință completă: animații, props, bone IDs, flags, state bags
### 🎯 Migrare Sistem Interacțiuni → qb-target (20 resurse)
Toate resursele care foloseau DrawText3D `[E]` / Markers au fost trecute pe **qb-target** (third-eye system) pentru experiență uniformă.

View File

@@ -26,47 +26,64 @@ CreateThread(function()
local fakeCardPed = createPedOnCoord(Config.FakeCardPed.model, Config.FakeCardPed.coords.x, Config.FakeCardPed.coords.y, Config.FakeCardPed.coords.z, Config.FakeCardPed.coords.w)
table.insert(Peds, ped)
table.insert(Peds, fakeCardPed)
local sleep = 1000
while true do
Wait(sleep)
-- qb-target pe NPC-ul de poza buletin
exports['qb-target']:AddTargetEntity(ped, {
options = {
{
icon = "fas fa-camera",
label = "Poza pentru buletin/ID",
action = function()
local ped = PlayerPedId()
local playerPed = PlayerPedId()
local coords = GetEntityCoords(playerPed)
local dist = #(coords - vector3(Config.HeadshotPed.coords.x, Config.HeadshotPed.coords.y, Config.HeadshotPed.coords.z))
local dist2 = #(coords - vector3(Config.FakeCardPed.coords.x, Config.FakeCardPed.coords.y, Config.FakeCardPed.coords.z))
-- Bubble text pt alte playeri
LocalPlayer.state:set("bubbleText", "Isi face poza pentru buletin...", true)
LocalPlayer.state:set("bubbleIcon", "📸", true)
LocalPlayer.state:set("browsingJobs", true, true)
if dist < 2 then
sleep = 0
DrawText3D("Apasa ~g~[E]~s~ pentru poza pe buletin/id", Config.HeadshotPed.coords.x, Config.HeadshotPed.coords.y, Config.HeadshotPed.coords.z + 1, 0.03, 0.03)
if IsControlJustPressed(0, 38) then
startMugshotAnimation()
Wait(250)
local result = GetBase64(PlayerPedId())
local shot = "assets/default.png"
if result.success then
shot = result.base64
end
-- Animatie de pozare (sta drept, mainile pe langa corp)
local dict = "mp_facial"
RequestAnimDict(dict)
while not HasAnimDictLoaded(dict) do Wait(10) end
TaskPlayAnim(ped, dict, "mic_chatter_camera3", 2.0, -2.0, -1, 49, 0, false, false, false)
Config.Notify(_t("headshot_taken"), "success")
startMugshotAnimation()
Wait(250)
local result = GetBase64(PlayerPedId())
local shot = "assets/default.png"
TriggerServerEvent("0r_idcard:server:saveHeadshot", shot)
end
elseif dist2 < 2 then
sleep = 0
DrawText3D("Press ~g~[E]~s~ to create a fake card", Config.FakeCardPed.coords.x, Config.FakeCardPed.coords.y, Config.FakeCardPed.coords.z + 1, 0.03, 0.03)
if IsControlJustPressed(0, 38) then
lib.showContext('fake_id_card')
end
else
sleep = 1000
end
end
if result.success then
shot = result.base64
end
-- Opreste animatia + bubble
ClearPedTasks(PlayerPedId())
LocalPlayer.state:set("browsingJobs", false, true)
Config.Notify(_t("headshot_taken"), "success")
TriggerServerEvent("0r_idcard:server:saveHeadshot", shot)
end,
},
},
distance = 2.0
})
-- qb-target pe NPC-ul de fake card
exports['qb-target']:AddTargetEntity(fakeCardPed, {
options = {
{
icon = "fas fa-id-card",
label = "Creeaza act fals",
action = function()
lib.showContext('fake_id_card')
end,
},
},
distance = 2.0
})
end)
lib.registerContext({
id = 'fake_id_card',
title = 'Create Fake ID Card',

View File

@@ -9,20 +9,53 @@ elseif GetResourceState("ox_target") ~= "missing" then
end
-- Comenzi utile pentru testare animatii + props
-- testanim dict anim [propName] [boneId] [ox oy oz] [rx ry rz]
local testProp = nil
RegisterCommand("testanim", function()
RegisterCommand("testanim", function(_, args)
if not args[1] then
print("^3[testanim]^0 Utilizare:")
print(" testanim dict anim -- doar animatie")
print(" testanim dict anim propName -- prop pe mana dreapta (bone 60309)")
print(" testanim dict anim propName boneId -- prop pe bone custom (zero offsets)")
print(" testanim dict anim propName boneId ox oy oz rx ry rz -- full control")
print("^3Exemple:^0")
print(" testanim amb@code_human_in_bus_passenger_idles@female@tablet@base base prop_cs_tablet")
print(" testanim mp_character_creation@lineup@male_a loop_raised prop_police_id_board 28422")
return
end
-- Opreste animatia/propul anterior
ClearPedTasks(PlayerPedId())
if testProp and DoesEntityExist(testProp) then DeleteEntity(testProp) testProp = nil end
local ped = PlayerPedId()
local dict = "amb@code_human_in_bus_passenger_idles@female@tablet@base"
local dict = args[1]
local anim = args[2] or "base"
-- Joaca animatia
RequestAnimDict(dict)
while not HasAnimDictLoaded(dict) do Wait(10) end
TaskPlayAnim(ped, dict, "base", 2.0, -2.0, -1, 49, 0, false, false, false)
local model = GetHashKey("prop_cs_tablet")
RequestModel(model)
while not HasModelLoaded(model) do Wait(10) end
local coords = GetEntityCoords(ped)
testProp = CreateObject(model, coords.x, coords.y, coords.z, true, true, true)
AttachEntityToEntity(testProp, ped, GetPedBoneIndex(ped, 60309),
0.03, 0.002, -0.0, 10.0, 160.0, 0.0, true, true, false, true, 1, true)
TaskPlayAnim(ped, dict, anim, 2.0, -2.0, -1, 49, 0, false, false, false)
-- Prop optional (arg 3+)
if args[3] then
local model = GetHashKey(args[3])
RequestModel(model)
while not HasModelLoaded(model) do Wait(10) end
local coords = GetEntityCoords(ped)
testProp = CreateObject(model, coords.x, coords.y, coords.z, true, true, true)
local bone = tonumber(args[4]) or 60309
local ox = tonumber(args[5]) or 0.0
local oy = tonumber(args[6]) or 0.0
local oz = tonumber(args[7]) or 0.0
local rx = tonumber(args[8]) or 0.0
local ry = tonumber(args[9]) or 0.0
local rz = tonumber(args[10]) or 0.0
AttachEntityToEntity(testProp, ped, GetPedBoneIndex(ped, bone),
ox, oy, oz, rx, ry, rz, true, true, false, true, 1, true)
end
end, false)
RegisterCommand("stopanim", function()