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:
BIN
cache/files/0r_idcard/resource.rpf
vendored
BIN
cache/files/0r_idcard/resource.rpf
vendored
Binary file not shown.
2
cache/files/0r_idcard/resource.rpf.db
vendored
2
cache/files/0r_idcard/resource.rpf.db
vendored
File diff suppressed because one or more lines are too long
BIN
cache/files/17mov_JobCenter/resource.rpf
vendored
BIN
cache/files/17mov_JobCenter/resource.rpf
vendored
Binary file not shown.
2
cache/files/17mov_JobCenter/resource.rpf.db
vendored
2
cache/files/17mov_JobCenter/resource.rpf.db
vendored
File diff suppressed because one or more lines are too long
@@ -29,6 +29,21 @@ git tkn: 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
|
|||||||
### 📋 Rulebook Updates
|
### 📋 Rulebook Updates
|
||||||
- ✏️ Regula 13: Commit info (Summary + Description) după fiecare modificare
|
- ✏️ 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)
|
### 🎯 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ă.
|
Toate resursele care foloseau DrawText3D `[E]` / Markers au fost trecute pe **qb-target** (third-eye system) pentru experiență uniformă.
|
||||||
|
|
||||||
|
|||||||
@@ -26,21 +26,27 @@ CreateThread(function()
|
|||||||
local fakeCardPed = createPedOnCoord(Config.FakeCardPed.model, Config.FakeCardPed.coords.x, Config.FakeCardPed.coords.y, Config.FakeCardPed.coords.z, Config.FakeCardPed.coords.w)
|
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, ped)
|
||||||
table.insert(Peds, fakeCardPed)
|
table.insert(Peds, fakeCardPed)
|
||||||
local sleep = 1000
|
|
||||||
|
|
||||||
while true do
|
-- qb-target pe NPC-ul de poza buletin
|
||||||
Wait(sleep)
|
exports['qb-target']:AddTargetEntity(ped, {
|
||||||
|
options = {
|
||||||
|
{
|
||||||
|
icon = "fas fa-camera",
|
||||||
|
label = "Poza pentru buletin/ID",
|
||||||
|
action = function()
|
||||||
|
local ped = PlayerPedId()
|
||||||
|
|
||||||
local playerPed = PlayerPedId()
|
-- Bubble text pt alte playeri
|
||||||
local coords = GetEntityCoords(playerPed)
|
LocalPlayer.state:set("bubbleText", "Isi face poza pentru buletin...", true)
|
||||||
local dist = #(coords - vector3(Config.HeadshotPed.coords.x, Config.HeadshotPed.coords.y, Config.HeadshotPed.coords.z))
|
LocalPlayer.state:set("bubbleIcon", "📸", true)
|
||||||
local dist2 = #(coords - vector3(Config.FakeCardPed.coords.x, Config.FakeCardPed.coords.y, Config.FakeCardPed.coords.z))
|
LocalPlayer.state:set("browsingJobs", true, true)
|
||||||
|
|
||||||
if dist < 2 then
|
-- Animatie de pozare (sta drept, mainile pe langa corp)
|
||||||
sleep = 0
|
local dict = "mp_facial"
|
||||||
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)
|
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)
|
||||||
|
|
||||||
if IsControlJustPressed(0, 38) then
|
|
||||||
startMugshotAnimation()
|
startMugshotAnimation()
|
||||||
Wait(250)
|
Wait(250)
|
||||||
local result = GetBase64(PlayerPedId())
|
local result = GetBase64(PlayerPedId())
|
||||||
@@ -50,23 +56,34 @@ CreateThread(function()
|
|||||||
shot = result.base64
|
shot = result.base64
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Opreste animatia + bubble
|
||||||
|
ClearPedTasks(PlayerPedId())
|
||||||
|
LocalPlayer.state:set("browsingJobs", false, true)
|
||||||
|
|
||||||
Config.Notify(_t("headshot_taken"), "success")
|
Config.Notify(_t("headshot_taken"), "success")
|
||||||
|
|
||||||
TriggerServerEvent("0r_idcard:server:saveHeadshot", shot)
|
TriggerServerEvent("0r_idcard:server:saveHeadshot", shot)
|
||||||
end
|
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)
|
distance = 2.0
|
||||||
|
})
|
||||||
|
|
||||||
if IsControlJustPressed(0, 38) then
|
-- 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')
|
lib.showContext('fake_id_card')
|
||||||
end
|
end,
|
||||||
else
|
},
|
||||||
sleep = 1000
|
},
|
||||||
end
|
distance = 2.0
|
||||||
end
|
})
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
|
||||||
lib.registerContext({
|
lib.registerContext({
|
||||||
id = 'fake_id_card',
|
id = 'fake_id_card',
|
||||||
title = 'Create Fake ID Card',
|
title = 'Create Fake ID Card',
|
||||||
|
|||||||
@@ -9,20 +9,53 @@ elseif GetResourceState("ox_target") ~= "missing" then
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- Comenzi utile pentru testare animatii + props
|
-- Comenzi utile pentru testare animatii + props
|
||||||
|
-- testanim dict anim [propName] [boneId] [ox oy oz] [rx ry rz]
|
||||||
local testProp = nil
|
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 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)
|
RequestAnimDict(dict)
|
||||||
while not HasAnimDictLoaded(dict) do Wait(10) end
|
while not HasAnimDictLoaded(dict) do Wait(10) end
|
||||||
TaskPlayAnim(ped, dict, "base", 2.0, -2.0, -1, 49, 0, false, false, false)
|
TaskPlayAnim(ped, dict, anim, 2.0, -2.0, -1, 49, 0, false, false, false)
|
||||||
local model = GetHashKey("prop_cs_tablet")
|
|
||||||
|
-- Prop optional (arg 3+)
|
||||||
|
if args[3] then
|
||||||
|
local model = GetHashKey(args[3])
|
||||||
RequestModel(model)
|
RequestModel(model)
|
||||||
while not HasModelLoaded(model) do Wait(10) end
|
while not HasModelLoaded(model) do Wait(10) end
|
||||||
local coords = GetEntityCoords(ped)
|
local coords = GetEntityCoords(ped)
|
||||||
testProp = CreateObject(model, coords.x, coords.y, coords.z, true, true, true)
|
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)
|
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)
|
end, false)
|
||||||
|
|
||||||
RegisterCommand("stopanim", function()
|
RegisterCommand("stopanim", function()
|
||||||
|
|||||||
Reference in New Issue
Block a user