Skip to content

Commit 6f90645

Browse files
committed
feat: add paintKit field to Sticker for sticker slab identification
Proto field 12 inside the Sticker sub-message encodes the actual sticker slab variant ID. Previously this field was silently ignored, causing all Sticker Slabs to decode identically (stickerId=37 for all variants). paintKit maps to the sticker catalog ID (stickers.json) and uniquely identifies which Sticker Slab variant an item is. Add decode/encode support and two test vectors: - NaVi (Holo) | Copenhagen 2024: defIndex=1355, rarity=5, paintKit=7256 - Eco Rush: defIndex=1355, rarity=3, paintKit=275
1 parent e5839f9 commit 6f90645

File tree

3 files changed

+74
-0
lines changed

3 files changed

+74
-0
lines changed

cs2_inspect/models.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ class Sticker:
2525
offset_z: Optional[float] = None
2626
pattern: int = 0
2727
highlight_reel: Optional[int] = None
28+
paint_kit: Optional[int] = None
2829

2930

3031
@dataclass

cs2_inspect/proto.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,8 @@ def encode_sticker(s: "Sticker") -> bytes: # noqa: F821 (forward ref ok)
213213
w.write_uint32(10, s.pattern)
214214
if s.highlight_reel is not None:
215215
w.write_uint32(11, s.highlight_reel)
216+
if s.paint_kit is not None:
217+
w.write_uint32(12, s.paint_kit)
216218
return w.to_bytes()
217219

218220

@@ -243,6 +245,8 @@ def decode_sticker(data: bytes) -> "Sticker": # noqa: F821
243245
s.pattern = value
244246
elif field_num == 11:
245247
s.highlight_reel = value
248+
elif field_num == 12:
249+
s.paint_kit = value
246250
return s
247251

248252

tests/test_inspect_link.py

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -408,3 +408,72 @@ def test_null_paintwear_roundtrip(self):
408408
data = ItemPreviewData(defindex=7, paintwear=None)
409409
result = deserialize(serialize(data))
410410
assert result.paintwear is None
411+
412+
413+
# ---------------------------------------------------------------------------
414+
# Sticker Slab test vectors (defIndex=1355, quality=8, slab variant via paint_kit)
415+
# ---------------------------------------------------------------------------
416+
417+
# URL A — rarity=5, keychains[0].sticker_id=37, keychains[0].paint_kit=7256
418+
SLAB_URL_A = (
419+
'steam://run/730//+csgo_econ_action_preview%20'
420+
'918191895A9BB191B994A199F991E191339096999181B4F149A98D5C0889'
421+
)
422+
423+
# URL B — rarity=3, keychains[0].sticker_id=37, keychains[0].paint_kit=275
424+
SLAB_URL_B = (
425+
'steam://run/730//+csgo_econ_action_preview%20'
426+
'CBDBCBD300C1EBCBE3C8FBC3A3CBBBCB69CACCC3CBDBEEAB58C9B8B67C83'
427+
)
428+
429+
430+
class TestStickerSlabVectors:
431+
def test_slab_a_defindex(self):
432+
assert deserialize(SLAB_URL_A).defindex == 1355
433+
434+
def test_slab_a_quality(self):
435+
assert deserialize(SLAB_URL_A).quality == 8
436+
437+
def test_slab_a_rarity(self):
438+
assert deserialize(SLAB_URL_A).rarity == 5
439+
440+
def test_slab_a_keychain_sticker_id(self):
441+
keychains = deserialize(SLAB_URL_A).keychains
442+
assert len(keychains) == 1
443+
assert keychains[0].sticker_id == 37
444+
445+
def test_slab_a_keychain_paint_kit(self):
446+
keychains = deserialize(SLAB_URL_A).keychains
447+
assert len(keychains) == 1
448+
assert keychains[0].paint_kit == 7256
449+
450+
def test_slab_b_defindex(self):
451+
assert deserialize(SLAB_URL_B).defindex == 1355
452+
453+
def test_slab_b_quality(self):
454+
assert deserialize(SLAB_URL_B).quality == 8
455+
456+
def test_slab_b_rarity(self):
457+
assert deserialize(SLAB_URL_B).rarity == 3
458+
459+
def test_slab_b_keychain_sticker_id(self):
460+
keychains = deserialize(SLAB_URL_B).keychains
461+
assert len(keychains) == 1
462+
assert keychains[0].sticker_id == 37
463+
464+
def test_slab_b_keychain_paint_kit(self):
465+
keychains = deserialize(SLAB_URL_B).keychains
466+
assert len(keychains) == 1
467+
assert keychains[0].paint_kit == 275
468+
469+
def test_paint_kit_roundtrip(self):
470+
data = ItemPreviewData(
471+
defindex=1355,
472+
quality=8,
473+
rarity=5,
474+
keychains=[Sticker(slot=0, sticker_id=37, paint_kit=7256)],
475+
)
476+
result = deserialize(serialize(data))
477+
assert len(result.keychains) == 1
478+
assert result.keychains[0].sticker_id == 37
479+
assert result.keychains[0].paint_kit == 7256

0 commit comments

Comments
 (0)