Thêm một khẩu súng
Bản release 1.4.0.64581 đã chạy thật: thêm khẩu Phượng Hoàng Vàng (smg_92) vào cửa hàng, qua
launcher gốc, không đụng gì vào client.
Ví dụ này chạm cả hai phía. Art của khẩu súng đi qua kênh patch, còn dòng trong shop thì không, nó là dữ liệu server. Làm thiếu một bên thì hỏng theo kiểu khó đoán: hoặc file art nằm trong archive mà chẳng ai bán, hoặc shop có dòng mà client không có model để vẽ.
Phần đi qua delta
Phần tiêu đề “Phần đi qua delta”Một file delta.dat 6,7 MB. patch.lst bên trong nó, nguyên văn:
P AvatarStar.pdeP AvatarStar_en_sg.pdeP AvatarStar_vi_vn.pdeP AvatarStar_th_th.pdeP AvatarStar_zh_tw.pdeP AvatarStar_zh_cn.pdeA AvatarStar.pde\mesh\weapon\smg_92\cubemap1_c.dds.cacheA AvatarStar.pde\mesh\weapon\smg_92\mz1_lod0.mesh.cacheA AvatarStar.pde\mesh\weapon\smg_92\rv1_lod0.mesh.cacheA AvatarStar.pde\mesh\weapon\smg_92\smg_92_d.dds.cacheA AvatarStar.pde\mesh\weapon\smg_92\smg_92_sc.dds.cacheA AvatarStar.pde\mesh\weapon\smg_92\w_dr.dds.cacheA AvatarStar.pde\mesh\weapon\smg_92\w_sr.dds.cacheA AvatarStar.pde\ui\skinf\lobby\smg_92.tga.cacheA AvatarStar.pde\weapon\smg_92.lua.cacheU AvatarStar_en_sg.pde\scripts\game_text.luaU AvatarStar_vi_vn.pde\scripts\game_text.luaU AvatarStar_th_th.pde\scripts\game_text.luaU AvatarStar_zh_tw.pde\scripts\game_text.luaU AvatarStar_zh_cn.pde\scripts\game_text.luaU client.exeChia ra ba nhóm.
Chín dòng A là art, vào hết base archive: mesh vũ khí, mesh muzzle flash, năm texture, icon
trong lobby, và file định nghĩa vũ khí bằng Lua. Dùng A vì smg_92 là đường dẫn mới tinh, archive
chưa từng có. Không đụng vào file nào đang ship.
Năm dòng U là game_text.lua, mỗi language pack một dòng. Pack nào cũng cần thêm hai key:
["id_datalist_smg_92"] = "Phượng Hoàng Vàng",["tips_datalist_smg_92"] = "Súng huyền thoại Phượng Hoàng Vàng.",Vì vậy mà cả năm pack phải đi kèm. Thêm một khẩu súng nghe như chuyện riêng của base archive, nhưng
tên nó thì mỗi thứ tiếng một kiểu. Sót một pack thì người chơi ngôn ngữ đó nhìn thấy key thô
id_datalist_smg_92 ngay trên màn hình.
Để ý game_text.lua là U chứ không phải A: file đã có sẵn, ta ghi đè bằng bản đã thêm hai dòng.
Nghĩa là cả file 700 KB đi trên đường truyền chứ không phải riêng hai dòng đó. Định dạng này mịn tới
mức file, hết.
Một dòng U client.exe là thứ làm update dừng lại. Đường dẫn không khớp archive nào đã P đăng
ký nên nó ghi thẳng ra thư mục client. Binary bên trong đã stamp sẵn lên 1.4.0.64581, và đó là con
số launcher đọc để biết đã cập nhật xong. Bỏ nó ra thì bản patch này chạy lại mỗi lần bấm ENTER, đến
vô tận.
Vì sao client gốc chịu nhận art mới
Phần tiêu đề “Vì sao client gốc chịu nhận art mới”Mọi file .cache trong delta đều mang idHash tính từ đường dẫn đích của chính nó. Client kiểm
hash này, sai thì bỏ qua, không log, không báo, tài nguyên chỉ đơn giản không hiện ra.
Kiểm lại chín payload trong delta.dat đã ship, hash lưu trong file so với hash tính lại từ đường
dẫn:
| Đường dẫn đích | Lưu trong file | Tính lại |
|---|---|---|
/mesh/weapon/smg_92/cubemap1_c.dds.cache |
0xe2398526 |
0xe2398526 |
/mesh/weapon/smg_92/mz1_lod0.mesh.cache |
0x95c04a25 |
0x95c04a25 |
/mesh/weapon/smg_92/rv1_lod0.mesh.cache |
0x86b6ab45 |
0x86b6ab45 |
/mesh/weapon/smg_92/smg_92_d.dds.cache |
0x7e0b1feb |
0x7e0b1feb |
/mesh/weapon/smg_92/smg_92_sc.dds.cache |
0x9ba4696f |
0x9ba4696f |
/mesh/weapon/smg_92/w_dr.dds.cache |
0xed34338a |
0xed34338a |
/mesh/weapon/smg_92/w_sr.dds.cache |
0xc1b9902c |
0xc1b9902c |
/ui/skinf/lobby/smg_92.tga.cache |
0x0da2b1ab |
0x0da2b1ab |
/weapon/smg_92.lua.cache |
0x305a11de |
0x305a11de |
Chín trên chín khớp. Không phải vá CRC gì trong client hết, chỉ cần tạo tài nguyên đúng luật ngay từ đầu.
Hai chỗ dễ vấp. Một là đường dẫn phải có dấu gạch chéo mở đầu (/mesh/...), thiếu là ra hash
khác. Hai là đường dẫn phân biệt hoa thường mà archive lại dùng chữ thường: /ui/skinf/... ra
hash đúng, /ui/skinF/... thì không, dù script Lua viết skinF và client vẫn tra ra được. Client hạ
về chữ thường rồi mới băm.
Còn game_text.lua không có đuôi .cache, và đó không phải nhầm. Nó nằm thô trong archive,
không bọc container, nên chẳng có idHash nào để kiểm. scripts/sys/skinF.lua cũng vậy.
Art mới lấy từ đâu
Phần tiêu đề “Art mới lấy từ đâu”smg_92 là bản sao byte-for-byte của khẩu stock smg_08, đổi tên smg_08 thành smg_92 rồi tính
lại idHash theo đường dẫn mới. Tên mới dài đúng bằng tên cũ nên không hằng số Lua nào phải dịch chỗ.
Mẹo này nên nhớ. Đổi tên cùng độ dài thì khỏi recompile Lua, còn clone từ một container đã ship thì tự nhiên có sẵn magic và version đúng của họ file đó. Rẻ hơn hẳn so với dựng tài nguyên từ số không.
Cần art thật thì research/16_add_content/build_smg_91.py là bản mẫu đầy đủ: dựng smg_91 từ một
donor, scale vertex, hue-rotate texture DXT, ráp lại bộ emitter, rồi in ra danh sách op cho
make_delta.py.
Phần đi qua database
Phần tiêu đề “Phần đi qua database”Delta không mang theo dòng shop. Dòng đó nằm ở hai bảng server, chạy qua catalogue.sql:
SYS_ITEMid9092định nghĩa món đồ: resource namesmg_92, hai key textid_datalist_smg_92vàtips_datalist_smg_92đúng bằng hai key delta vừa thêm vàogame_text.lua, damage 363, lực chiến 414.SYS_ITEM_PRICEđặt giá 100 vàng, thời hạn 86400 giây tức một ngày.
Chạy SQL xong thì:
docker restart as-memcacheddocker restart as-goRestart memcached là bắt buộc chứ không phải cho chắc ăn. Catalogue nằm trong cache, không xóa thì shop vẫn trả danh sách cũ và ta đi mò lỗi nhầm chỗ.
Manifest
Phần tiêu đề “Manifest”Năm block nối đuôi nhau, SrcVer của block sau bằng đúng DstVer của block trước:
<CurVersion>1.4.0.64581</CurVersion><UpdateVersion SrcVer="1.4.0.64564" DstVer="1.4.0.64577"> <Url PatchName="delta.dat" FileName="" PatchMode="Patch">Update/Game/1.4.0.64564-1.4.0.64577/delta.dat</Url></UpdateVersion>...<UpdateVersion SrcVer="1.4.0.64580" DstVer="1.4.0.64581"> <Url PatchName="delta.dat" FileName="" PatchMode="Patch">Update/Game/1.4.0.64580-1.4.0.64581/delta.dat</Url></UpdateVersion>Client đang ở bản nào thì vào từ block khớp SrcVer của bản đó rồi chạy dần lên. Nhà phát hành làm y
hệt, kênh Đài Loan có 61 block như vậy, và nhờ đó delta nào cũng rơi xuống đúng bản nguồn nó được
dựng cho.
Bản trước đó là một bản gỡ ra
Phần tiêu đề “Bản trước đó là một bản gỡ ra”Nhắc riêng vì nó cho thấy D chạy thế nào. Delta 1.4.0.64580 không thêm gì, nó gỡ khẩu súng của
bản trước là smg_91:
D AvatarStar.pde\mesh\weapon\smg_91\rv1_lod0.mesh.cacheD AvatarStar.pde\mesh\weapon\smg_91\smg_91_d.dds.cache... (tổng cộng 8 dòng D)U AvatarStar_en_sg.pde\scripts\game_text.lua <- gỡ luôn hai key text... (5 pack)U client.exeDọn file mới thêm bằng D, dọn phần text bằng U với bản game_text.lua không còn hai key đó. Cùng
một cơ chế, chạy ngược lại.
Để ý bản gỡ này vẫn nặng 6,3 MB, xấp xỉ bản thêm vào 6,7 MB, dù nó gần như không mang art. Gần hết
dung lượng là năm file game_text.lua cộng client.exe 2,7 MB. Thứ gì đụng vào cả năm language pack
thì đó là sàn, không xuống thấp hơn được.
Chạy lại gói demo
Phần tiêu đề “Chạy lại gói demo”Gói nằm ở ~/Downloads/avatarstar_add_gun_demo/:
Update/Game/1.4.0.64579-1.4.0.64580/delta.dat gỡ khẩu smg_91Update/Game/1.4.0.64580-1.4.0.64581/delta.dat thêm khẩu smg_92GameUpdate/update.xml manifestcatalogue.sql dòng shop- Copy
Update/vàGameUpdate/vào patch root, ví dụ/opt/avatarstar/server/patch/root. - Client đang ở
1.4.0.64579, bấm update, nó tự kéo64580rồi64581. - Chạy
catalogue.sqlvào databasego, rồi restart memcached và go. - Mở shop, tìm Phượng Hoàng Vàng.
Đọc tiếp
Phần tiêu đề “Đọc tiếp”- delta.dat giải thích cơ chế bên dưới.
- Ship một bản update là quy trình chung, kèm mấy chỗ hỏng mà không ai báo.
Bản nháp đang review. Nội dung nội bộ, đừng chia sẻ ra ngoài nhóm.