Saat ini sangat sulit untuk menemukan informasi yang solid dan bantuan nyata mengenai S3PI, terlebih lagi jika Anda mencoba membuat program menggunakan S3PI sebagai perpustakaan untuk berinteraksi dengan file paket SIMS. Selain itu, perpustakaan S3PI tidak ada di GitHub dan tidak memiliki repositori di sini.
Untuk alasan ini, saya memutuskan untuk membuat repositori ini untuk menyimpan perpustakaan S3PI secara keseluruhan, dengan contoh kode dan tips tentang cara menggunakannya dengan benar. Selain itu, saya telah menyusun di sini semua informasi berguna yang saya temukan di internet terkait dengan S3PI!
Jika Anda ingin menyumbangkan lebih banyak informasi, silakan buat permintaan tarik atau laporkan melalui tab "Masalah". Saya akan melakukan yang terbaik untuk menyimpan repositori ini dengan informasi dan contoh sebanyak mungkin, tetapi jika penulis S3PI memintanya, saya akan mengambil repositori ini secara offline.
Penting
Mengingat bahwa semua kredit untuk pembuatan Perpustakaan S3PI pergi ke "Peter L Jones" yang luar biasa!
"Antarmuka Paket Sims 3" menyediakan perpustakaan inti kode portabel yang "memahami" paket game SIMS3. Perhatikan bahwa (dengan beberapa tweak kecil) kode perpustakaan inti juga memahami format paket game lainnya (misalnya SimCity Online, SIMS4).
Seiring dengan perpustakaan inti adalah sejumlah "pembungkus" yang menyediakan bagian utama dari proyek. Ini menangani deserialisasi dan serialisasi data dalam paket (atau sumber lain).
Alat lebih lanjut dapat menggunakan pustaka ini dan pembungkus untuk memanipulasi konten data file paket dari game SIMS.
Perhatikan bahwa pengembangan di perpustakaan ini dan pembungkus yang disediakan di sini sekarang telah selesai.
"S3PI" adalah akronim untuk "antarmuka paket SIMS3 ™". Ini memberikan dukungan untuk mengakses data dalam file "paket" masing -masing yang digunakan oleh game Electronic Arts SIMS3 ™. "Paket" adalah file disk dengan ekstensi file biasanya dari ".package" (tetapi ekstensi lain digunakan). Namun, fitur identifikasi utama yang digunakan oleh S3PI adalah cookie ajaib empat byte di awal file, yang harus "DBPF". Selain itu, nomor versi format file harus 2 untuk Sims 3 ™ (atau 3 untuk Sim City 5 ™, yang nyaris tidak didukung).
Perhatikan bahwa paket "dilindungi" (dengan kue ajaib "DBPP") tidak didukung. Perhatikan bahwa paket "sementara" (dengan kue ajaib "DBBF") saat ini tidak didukung.
S3PI adalah seperangkat rakitan .NET (didokumentasikan di bawah ini dan tersedia di sini) yang mengimplementasikan deskripsi dari wiki Sims 3 (dengan halaman-halaman ini alternatif tersedia di sini sebagai wiki-mirror). Perhatikan bahwa selalu layak untuk diperiksa di sana jika Anda tidak yakin akan sesuatu, baik tentang bagaimana sesuatu harus bekerja atau jika Anda pikir Anda telah menemukan masalah di S3PI, yang tetap sangat mungkin. Baik wiki maupun perpustakaan tidak selalu benar - memang, mungkin keduanya salah dengan cara yang berbeda.
Perpustakaan S3PI dilengkapi dengan file bantuan yang dikompilasi (.chm) yang menggambarkan banyak dari apa yang perlu Anda ketahui. Anda juga dapat mengakses versi ini, di sini. Halaman ini mencoba memberikan gambaran cepat, karena perpustakaannya cukup luas dan mungkin sulit untuk mengetahui apa yang perlu Anda ketahui.
Halaman ini dibagi menjadi tiga bagian yang tersisa.
Setelah Anda memahami cara menggunakan pembungkus untuk mengakses data dalam suatu paket, Anda harus berkonsultasi dengan daftar jenis file SIMS3 untuk melihat mana yang didukung dan cara mendapatkan dukungan (jika bukan bagian dari distribusi S3PI).
Tip
Jika Anda memiliki pertanyaan yang belum terjawab, jangan ragu untuk memposting di sini di forum/diskusi. Akan sangat menyenangkan untuk membantu!
Perpustakaan adalah satu set .NET Assembly DLL. Jika Anda cenderung mengerjakan lebih dari satu proyek menggunakan perpustakaan, saya sangat menyarankan menempatkannya di folder yang terpisah dari ruang kerja proyek dan solusi Anda - tetapi dekat dengan struktur folder Anda. Dengan cara ini, mudah untuk mengganti semuanya tanpa harus memperbarui setiap proyek.
Untuk menggunakan perpustakaan dari proyek baru, pertama -tama Anda perlu mengetahui bagian mana dari perpustakaan yang akan Anda gunakan. Saya dengan sengaja memisahkan bagian -bagian dependen sehingga proyek Anda hanya perlu merujuk DLL yang dibutuhkan, karenanya menjaga ukuran proyek Anda dalam ukuran. Kelemahannya adalah ada banyak DLL!
Hal pertama yang perlu diperhatikan adalah bahwa banyak dari mereka adalah "pembungkus" - apa pun dengan nama seperti SomethingResource.DLL . Ini berisi kode untuk memahami konten satu atau lebih sumber daya dalam file paket SIMS 3.
Pertama, mari kita lihat setiap majelis yang tersisa. Setelah ini, saya akan memberikan garis besar cara memulai proyek baru. Saya akan mengakhiri beberapa pemikiran tentang mengatur praktik kerja Anda.
Catatan
Anda harus menyetujui lisensi GPLV3 sebelum mendistribusikan kode Anda. Perhatikan bahwa, saat Anda menautkan ke perpustakaan GPLV3, Anda pada dasarnya menggunakannya kembali dan harus mendistribusikan kode Anda dengan persyaratan yang setara. Anda dapat menemukan detail lebih lanjut di situs Yayasan Perangkat Lunak Gratis.
Kapan memasukkannya: Selalu - itu diperlukan oleh beberapa bagian perpustakaan lainnya.
Ringkasan: Berisi sejumlah kelas yang tidak secara langsung berhubungan dengan "The Sims 3" dan tidak memiliki referensi ke salah satu jenis s3pi.Interfaces . Mereka bisa, mungkin berguna untuk proyek yang tidak menggunakan perpustakaan S3PI lainnya (karenanya memisahkannya).
Bacaan lebih lanjut: Dengan merujuk majelis ini, Anda mendapatkan yang berikut ...
System.Collections.Generic.AHandlerList<T> - Abstrak Perpanjangan List<T> Memberikan umpan balik pada pembaruan daftar melalui EventHandler yang disediakan.System.ArgumentLengthException - mewakili kesalahan dalam panjang argumen ke suatu metode.System.Extensions - Metode ekstensi yang berguna yang tidak disediakan oleh LINQ (dan tanpa eksekusi yang ditangguhkan). (Nama kelas meragukan dan dapat berubah ...)System.Security.Cryptography.FNV32 - FNV32 Hash RutinesSystem.Security.Cryptography.FNV64 - fnv64 hash rutinSystem.Text.SevenBitString -Baca dan tulis string yang disandikan tujuh-bit dalam Encoding yang diberikan dari atau ke Stream .System.Security.Cryptography.Sims3PackCRC - Hitung CRC potongan data yang disimpan dalam file SIMS3Pack. (Oke, bisa dibilang ini tidak ada alasan berada di sini tetapi dalam hal ketergantungan kode, masuk akal!) Kapan harus memasukkannya: selalu.
Ringkasan: Awalnya dimaksudkan untuk memungkinkan berbagai pengaturan internal ke perpustakaan diubah dengan mengganti DLL. Ini tidak pernah terjadi.
Bacaan lebih lanjut: Tidak ada.
Kapan harus memasukkannya: selalu. Tidak hanya diperlukan oleh perpustakaan itu sendiri tetapi juga mendefinisikan API publik.
Ringkasan: Menyediakan sejumlah antarmuka, kelas abstrak, dan kelas penolong yang digunakan di seluruh perpustakaan dan pembungkus, yang menentukan metode publik yang disediakan oleh berbagai kelas perpustakaan.
Bacaan lebih lanjut:
s3pi.Interfaces Dokumentasi Namespace. Perhatikan bahwa namespace "tercemar" oleh kelas -kelas dari s3pi.GenericRCOL . Purist juga mungkin mempertimbangkan beberapa kelas pembantu "polusi" ...
Kapan memasukkannya: Saat bekerja dengan file paket Sims 3.
Ringkasan: Menyediakan implementasi konkret dari kelas abstrak dan antarmuka yang ditentukan dalam s3pi.Interfaces .
Bacaan lebih lanjut: Tidak ada.
Kapan memasukkannya: Saat bekerja dengan pembungkus sumber daya.
Ringkasan: Jika Anda membuat sumber daya baru atau sumber daya membaca dari suatu paket, ini adalah mekanisme yang disarankan. Namun, ada alternatif.
Bacaan lebih lanjut:
s3pi.WrapperDealer.WrapperDealer - Bertanggung jawab untuk mengaitkan ResourceType dalam IResourceIndexEntry dengan kelas tertentu ("pembungkus") yang memahaminya atau pembungkus default. s3pi.DefaultResource dan s3pi.GenericRCOLResource memberikan dasar -dasar untuk memahami cara menggunakan sumber daya setelah Anda memiliki referensi untuk itu.
Kapan memasukkannya: Jika Anda menginginkan nama file standar komunitas.
Ringkasan: Pada awal Sims 3, komunitas modding menyetujui format set untuk bagaimana sumber daya yang dikemas harus disebutkan saat di luar file paket. Majelis ini menyediakan implementasi untuk Perpustakaan S3PI.
Bacaan lebih lanjut: s3pi.Extensions namespace. Area perpustakaan ini masih perlu didokumentasikan dengan benar.
Kapan memasukkannya: Saat Anda ingin copyableMessageBox (atau issueException).
Ringkasan: Perakitan ini menyediakan cara menampilkan pesan yang memungkinkan pengguna untuk menyalin konten dengan mudah. Di masa depan, kontrol umum lainnya mungkin muncul di sini.
Bacaan Lebih Lanjut: Kelas CopyableMessageBox , Pencacahan CopyableMessageBoxButtons dan Pencacahan CopyableMessageBoxIcon .
Kapan memasukkannya: ketika Anda menginginkan salah satu kontrol khusus.
Ringkasan: Perakitan ini menyediakan kontrol khusus yang terkait dengan tipe data di S3PI.
Bacaan lebih lanjut: Kelas ResourceTypeCombo , kelas TGIBlockCombo dan kelas TGIBlockListEditor . Area perpustakaan ini masih perlu didokumentasikan dengan benar.
Kapan memasukkannya: Saat Anda menggunakan gambar DDS dan ingin cara menampilkannya di aplikasi WinForms.
Ringkasan: Majelis ini menyediakan kontrol sumber daya kontrol dan DDS.
Bacaan Lebih Lanjut: Kelas DDSPanel dan DDSPanel.MaskChannel Enumeration.
Kapan harus memasukkannya: mungkin berguna saat menulis penolong untuk s3pe.
Ringkasan: Memberikan dukungan untuk memetakan sumber daya ke satu atau lebih program yang mungkin tertarik pada sumber daya semacam itu.
Bacaan lebih lanjut: s3pi.Helpers namespace. Area perpustakaan ini masih perlu didokumentasikan dengan benar.
Siapkan referensi yang Anda butuhkan berdasarkan bagian sebelumnya System.Custom , s3pi.Settings , s3pi.Interfaces dan lainnya. Selain itu, Anda perlu mempertimbangkan apakah Anda ingin merujuk rakitan pembungkus tertentu. Dalam kebanyakan kasus, ini akan menjadi pendekatan yang tepat. Rakitan yang Anda referensi akan, secara default, dapat disalin ke folder output proyek, bersama dengan program Anda.
Perhatikan bahwa ada komponen tambahan tertentu yang digunakan, seperti file konfigurasi, yang juga perlu Anda atur untuk build proyek Anda untuk disalin (jika lebih baru) ke folder output.
Anda mungkin ingin melihat solusi S3OC dan S3PE Visual Studio untuk melihat bagaimana saya melakukannya.
S3PI menyediakan sejumlah kelas C# untuk membantu program yang ingin mengakses file paket Sims 3 dan sumber daya yang disimpan di dalamnya. "Perpustakaan inti" hanya memahami wadah paket itu sendiri - tidak memiliki pemahaman tentang konten sumber daya. Itu didelegasikan ke "pembungkus". Pembungkus dikaitkan dengan sumber daya dengan menyatakan daftar ResourceTypes yang mereka dukung. Perpustakaan inti mengembalikan instance dari kelas sumber daya yang menilai ke perpustakaan "klien".
Jadi, pembungkus memiliki dua tujuan utama: untuk memberikan "pemahaman" tentang konten satu atau lebih jenis sumber daya dan untuk membuat perpustakaan inti tahu jenis sumber daya mana yang mereka pahami. Pembungkus dapat memberikan satu atau lebih penangan sumber daya karena terlihat cocok tetapi penulis didorong untuk menjaga kekhawatiran yang berbeda terpisah menjadi pembungkus yang berbeda.
Perpustakaan inti mengidentifikasi pembungkus dengan mencari melalui rakitan di folder perpustakaan S3PI untuk mereka yang memiliki antarmuka yang sesuai.
WrapperDealer memiliki antarmuka yang memungkinkan aplikasi klien memungkinkan dan menonaktifkan kombinasi tertentu dari ResourceType dan pembungkus.
Saya sekarang telah menyertakan DefaultResource dalam dokumentasi perpustakaan S3PI.
Contoh paling sederhana adalah bahwa diberikan dalam DefaultResource dalam distribusi sumber. Ini "tidak melakukan apa -apa" di luar apa yang penting untuk pembungkus apa pun.
Ini mendefinisikan dua kelas:
public class DefaultResource : AResource { }
public class DefaultResourceHandler : AResourceHandler { } Majelis yang berisi pembungkus harus berisi kelas yang mengimplementasikan AResourceHandler . Kelas ini menyediakan IDictionary<Type, List<string>> Pencarian antara kelas yang mengimplementasikan AResource dan daftar string yang berisi nilai -nilai ResourceType . (String yang digunakan adalah nilai -nilai dari cast TypedValue ResourceType ke string, yaitu string hex.)
DefaultResource menggunakan "*" untuk memberi tahu WrapperDealer bahwa senang mengambil semuanya. Jangan gunakan ini di pembungkus Anda!
DefaultResource , kalau begitu.
Sangat disarankan Anda memiliki const Int32 recommendedApiVersion = 1; Di bagian atas kelas Anda untuk kompatibilitas di masa mendatang. Ini memungkinkan Anda untuk "versi" API Wrapper Anda jika Anda membutuhkannya. Mungkin tidak berguna dalam praktik.
Anda harus memiliki properti AApiVersionedFields RecommendedApiVersion .
Konstruktor untuk DefaultResource menunjukkan poin penting - sumber daya baru tidak diketahui apa pun . Ini dapat memeriksa apakah itu baru dengan memeriksa bahwa aliran yang diteruskan ke konstruktor adalah nol. Ini kemudian harus membuat MemoryStream dan mengisinya dengan konten data minimum yang valid untuk sumber daya.
Itu saja! Tidak ada lagi yang harus Anda lakukan. Tentu saja, Anda belum memberi siapa pun alasan untuk menggunakan pembungkus Anda ...
Catatan
Setelah beberapa pemikiran, ImageResource dan TextResource dianggap sudah usang. Namun, mereka akan tetap di perpustakaan untuk masa mendatang. Terlepas dari apa yang tertulis di bawah ini, saya tidak lagi menganggapnya sebagai ide yang baik untuk memiliki pembungkus untuk sumber daya yang hanya aliran byte.
Pendekatan yang diambil untuk sumber daya DDS dianggap lebih benar. Sebuah akhori langsung dinyatakan di bawah ini: Desain di sini dipengaruhi oleh S3PE daripada menerapkan apa pun mengenai struktur data itu sendiri, yang merupakan tujuan pembungkus. Ini seharusnya ditangani dengan cara yang mirip dengan sumber daya DDS.
Ocanan lebih lanjut adalah penambahan dan kemudian penghapusan pembungkus sumber daya _VID selama siklus QA ketika ditemukan bahwa konten itu murni output dari codec audiovisual seni elektronik khusus, daripada memiliki konten yang dapat diuraikan secara bermanfaat.
Kesimpulannya: "Nilai" seharusnya hanya string. Biasanya, formatter bawaan membangun yang sesuai dari properti publik Anda.
Contoh yang sedikit lebih kompleks adalah Imageresource. Itu menempel pada model dua kelas:
public class ImageResource : AResource { }
public class ImageResourceHandler : AResourceHandler { }Pembungkus ini menangani gambar - banyak jenis sumber daya yang berbeda hanya disimpan file PNG89.
Konstruktor statis untuk ImageResourceHandler membaca daftar semua jenis sumber daya gambar yang diketahui (dari file di folder tempat perakitan berada). Ini kemudian digunakan untuk mengisi daftar IDictionary<Type, List<string>> dalam konstruktor instan, yang kemudian digunakan oleh WrapperDealer . Ini berarti mudah untuk menambahkan jenis sumber daya baru ke dalam daftar dukungan pembungkus ini - cukup edit file teks dan tambahkannya, tidak perlu mengkompilasi ulang. (Ini pola yang bagus, saya seharusnya membuatnya lebih mudah untuk menggunakan kembali ...)
Kelas ImageResource tetap cukup sederhana. Konstruktornya memastikan ada gambar PNG89 yang valid jika melewati aliran nol. Dan menyediakan properti tunggal yang disebut "nilai" yang mengembalikan System.Drawing.Image yang dibuat dari data PNG89. Itu tidak mendukung menyimpan gambar kembali ke sumber daya yang ada.
Properti Value layak disebut lebih lanjut - ujung depan demo S3PI (sekarang dikenal sebagai S3PE) memeriksa apakah sumber daya memiliki properti Value dan, jika demikian, apakah ia memiliki jenis gambar atau data string. Ia tahu cara menampilkan keduanya (dan keduanya sendirian, saat ini). Mengembalikan yang tepat dapat berguna dalam debugging.
Anda akan melihat posisi aliran diatur ke nol sebelum digunakan - selalu anggap itu dalam keadaan yang tidak diketahui.
Pembungkus TextResource sangat mirip - sumber daya teks didefinisikan dalam file; Ini memiliki properti "nilai" yang mengembalikan sumber daya sebagai nilai string. Selain itu, ia memiliki beberapa properti khusus teks, termasuk mengakses data sebagai XML. (Akan lebih baik desain untuk memiliki pembungkus XML sebagai perpanjangan dari pembungkus teks dan hanya menangani file XML yang diketahui di dalamnya ...)
Pembungkus ini menangani satu jenis sumber daya - peta nama paket. Ini menyediakan antarmuka IDictionary<ulong, string> , yang memungkinkan peta dibaca dan diperbarui. Ini adalah contoh yang sangat sederhana tentang cara menangani pembaruan.
Begini cara kerjanya. Ini adalah contoh sederhana tetapi polanya dapat diperluas ke kebutuhan yang lebih kompleks.
Pekerjaan dilakukan di sejumlah tempat:
Properti Stream memeriksa apakah sumber daya telah dinyatakan bahwa diubah). Jika demikian, ia membuang aliran saat ini dan memanggil UnParse() .
Konstruktor instan memeriksa aliran nol dan memanggil UnParse() untuk membangun sumber daya valid minimum.
Metode Parse(Stream s) membaca data ke dalam struktur data yang digunakan untuk memanipulasinya - di sini Dictionary<ulong, string> . Karena ini adalah struktur berulang dari berbagai entri panjang yang memungkinkan data dimasukkan, tidak efisien untuk menggunakan data dalam aliran.
Metode UnParse() mengekspor struktur data kembali ke aliran baru, membuat objek baru jika diperlukan.
Seperti disebutkan di atas, properti Stream perlu mengetahui apakah sumber daya telah dinyatakan. Implementasi antarmuka IDictionary<ulong, string> menangani ini dengan memanggil OnResourceChanged(this, EventArgs.Empty) untuk operasi pembaruan. Ini disediakan di AResource dan menetapkan sumber daya menjadi kotor, serta memanggil penangan ResourceChanged dari apa pun yang mendengarkan acara tersebut.
Catalogresource benar -benar hanya mengambil ide -ide di NamemapResource lebih lanjut. Ini memiliki kelas abstrak untuk serangkaian sumber daya terkait. Saya sudah mencoba untuk menjaga pola pengkodean yang konsisten untuk membantu memahami apa yang terjadi. Saya menyerahkannya sebagai latihan bagi pembaca untuk bekerja melalui implementasi untuk melihat bagaimana semua kelas berinteraksi. Semoga masuk akal! (Jika tidak, saya akan bingung saat bug muncul !!)
Ini memiliki manfaat dari menjadi baru dan, meskipun relatif sederhana, memang memiliki beberapa bit yang menarik. Ini juga salah satu pembungkus yang paling sering saya konsultasikan ketika menulis yang baru.
Sumber daya RCOL adalah sumber daya normal, seperti dijelaskan di atas - dengan perbedaan mendasar bahwa itu adalah wadah untuk "sumber daya" lainnya, yang dikenal sebagai blok RCOL. Setiap blok memiliki format yang diidentifikasi oleh kode empat karakter ("Fourcc" atau tag); Blok juga memiliki jenis sumber daya. Sumber daya RCOL (dalam paket) memiliki jenis yang sama dengan blok RCOL pertama di (di sumber daya) dan sumber daya dinamai setelah blok RCOL pertama ini. Beberapa sumber daya RCOL hanya berisi satu blok RCOL; Lainnya mengandung beberapa blok RCOL.
Dukungan dasar disediakan oleh s3pi.GenericRCOLResource . Selain membaca blok dari dan menulis blok ke paket, pembungkus sumber daya memiliki metode tambahan untuk mendukung format RCOL dan ada penangan penangan blok RCOL.
(Perhatikan bahwa istilah "potongan" secara longgar digunakan untuk merujuk ke blok RCOL pada waktu ...)
Ada kelas abstrak, ARCOLBlock , yang mendefinisikan fundamental. Ada implementasi default, DefaultRCOL , karena ketika tidak ada penangan blok RCOL yang cocok dengan registri, yang memberikan dukungan minimal.
Selain memperluas ARCOLBlock daripada AResource , tugas menulis handler blok RCOL sangat mirip dengan menulis pembungkus sumber daya.
Namun, Electronic Arts / Maxis baru-baru ini mulai membuat hidup sedikit lebih sulit karena beberapa wadah RCOL tunggal tidak persis sesuai dengan pemahaman asli tentang bagaimana wadah harus bekerja. Waspadai hal ini saat membaca kode atau menulis sendiri.
Pertama, Anda perlu memiliki pengalaman dan sudah tahu cara mengedit file paket SIMS, menggunakan perangkat lunak S3PE. S3PE pada dasarnya berfungsi sebagai antarmuka grafis untuk S3PI, yang dapat digunakan pengguna umum. Oleh karena itu, aman untuk mengatakan bahwa S3PI mampu melakukan semua yang dapat dilakukan S3PE, dan bahkan lebih.
Catatan
S3PE juga tersedia untuk diunduh di repositori ini. Baik file yang dapat dieksekusi dan kode sumber C# dan solusi Visual Studio.
Mengetahui hal ini, untuk mengimplementasikan S3PI dalam program Anda, Anda perlu mengkode seolah -olah program Anda menggunakan S3PE untuk melakukan tindakan.
Katakanlah Anda ingin menghapus sumber daya tertentu dari file paket. Jika Anda menggunakan S3PE, pertama -tama Anda akan membuka file paket itu, cari sumber daya yang akan dihapus. Kemudian Anda akan menekan tombol DEL untuk menghapus file itu, dan kemudian menyimpan. Setelah file paket disimpan, Anda akan menutupnya.
Jika Anda melakukan ini menggunakan S3PE, maka program Anda harus melakukan langkah yang sama jika Anda menggunakan S3PI untuk melakukan tindakan yang sama ini. Lihat kode sampel di bawah ini, melakukan tindakan menghapus sumber daya "0x00B2D882-0X00000000-0X0A12300000FF0000" dari file paket terbuka, sebagai contoh ...
using s3pi ;
using s3pi . Interfaces ;
using s3pi . Package ;
//Open the package
IPackage package = Package . OpenPackage ( 0 , "C:/Folder/someFile.package" , true ) ;
//Search the resource "0x00B2D882-0x00000000-0x0A12300000FF0000" inside the package
foreach ( IResourceIndexEntry item in package . GetResourceList )
{
//Get current entrie resource TGI
string typeHex = GetLongConvertedToHexStr ( item . ResourceType , 8 ) ;
string groupHex = GetLongConvertedToHexStr ( item . ResourceGroup , 8 ) ;
string instanceHex = GetLongConvertedToHexStr ( item . Instance , 16 ) ;
//If is the target resource, delete it
if ( typeHex == "0x00B2D882" && groupHex == "0x00000000" && instanceHex == "0x0A12300000FF0000" )
package . DeleteResource ( item ) ;
}
//Save the changes
package . SavePackage ( ) ;
//Close the package
Package . ClosePackage ( 0 , package ) ; Penting
Sangat penting bahwa Anda selalu menutup file paket yang dibuka setelah Anda selesai mengerjakannya.
Catatan
The Dream Launcher adalah peluncur untuk Sims 3 yang dibuat oleh "Marcos4503". Peluncur Dream memanfaatkan S3PI untuk mengimplementasikan berbagai fitur, seperti menggabungkan paket, membersihkan penyelamatan, dan fungsi lainnya. Anda dapat mengikuti tautan ini untuk memeriksa repositori peluncur mimpi dan melihat kode sumber untuk lebih banyak contoh penggunaan S3PI. Peluncur impian dibuat menggunakan C# sebagai bahasa pemrograman.
using s3pi ;
using s3pi . Interfaces ;
using s3pi . Package ;
//Creates a new Package that will receive the resources from 2 other Packages
IPackage finalPackage = Package . NewPackage ( 0 ) ;
//Open the Package 1 and copy all resources to the final package
IPackage package1 = Package . OpenPackage ( 0 , "C:/Folder/package1.package" , false ) ;
foreach ( IResourceIndexEntry item in package1 . GetResourceList )
finalPackage . AddResource ( item , ( package1 as APackage ) . GetResource ( item ) , true ) ;
Package . ClosePackage ( 0 , package1 ) ;
//Open the Package 2 and copy all resources to the final package
IPackage package2 = Package . OpenPackage ( 0 , "C:/Folder/package2.package" , false ) ;
foreach ( IResourceIndexEntry item in package2 . GetResourceList )
finalPackage . AddResource ( item , ( package2 as APackage ) . GetResource ( item ) , true ) ;
Package . ClosePackage ( 0 , package2 ) ;
//Enable compression for all viable resources of final merged package (the same way S3PE does)
foreach ( IResourceIndexEntry item in finalPackage . GetResourceList )
item . Compressed = ( ushort ) ( ( item . Filesize != item . Memsize ) ? 0xFFFF : 0x0000 ) ;
//Saves the final Package, result of the merge
finalPackage . SaveAs ( "C:/Folder/finalFile.package" ) ;
Package . ClosePackage ( 0 , finalPackage ) ; using s3pi ;
using s3pi . Interfaces ;
using s3pi . Package ;
//Open a .nhd save file
IPackage nhdSaveFile = Package . OpenPackage ( 0 , "C:/Folder/saveFile.nhd" , false ) ;
//Search inside the package, by the first thumbnail of type "SNAP" (or hex type "0x6B6D837E")
foreach ( IResourceIndexEntry item in nhdSaveFile . GetResourceList )
if ( GetLongConvertedToHexStr ( item . ResourceType , 8 ) == "0x6B6D837E" )
{
//Get the base stream for this resource
Stream aPackageStream = ( nhdSaveFile as APackage ) . GetResource ( item ) ;
//Get the base resource using the "ImageResource" s3pi wrapper***
IResource baseResource = ( IResource ) ( new ImageResource . ImageResource ( 0 , aPackageStream ) ) ;
//Get the bitmap from base resource stream
BitmapImage bitmapImage = new BitmapImage ( ) ;
bitmapImage . BeginInit ( ) ;
bitmapImage . StreamSource = baseResource . Stream ;
bitmapImage . CacheOption = BitmapCacheOption . OnLoad ;
bitmapImage . EndInit ( ) ;
bitmapImage . Freeze ( ) ;
//... continue ...//
//Cancel the search
break ;
}
//Close the save file
Package . ClosePackage ( 0 , nhdSaveFile ) ; *** Perhatikan bahwa di sini, kami dapat menggunakan kelas WrapperDealer sehingga S3PI akan memberi kami pembungkus yang benar untuk sumber daya yang kami kerjakan, secara otomatis. Jika kami menggunakan WrapperDealer di sana, S3PI akan secara otomatis memberi kami pembungkus ImageResource , namun, WrapperDealer diketahui tidak sesuai dengan beberapa kerangka kerja .NET, seperti WPF itu sendiri, menyebabkan kerusakan. Untuk alasan ini, selalu disarankan untuk menggunakan pembungkus secara langsung, saat bekerja dengan sumber daya di dalam file paket. Jika kami memilih untuk menggunakan kelas WrapperDealer untuk mendapatkan gambar, cuplikan kode akan terlihat seperti ini ...
//...
//Get the resource using WrapperDealer
IResource resource = WrapperDealer . GetResource ( 0 , nhdSaveFile , item , true ) ;
//Get the bitmap from base resource stream
BitmapImage bitmapImage = new BitmapImage ( ) ;
bitmapImage . BeginInit ( ) ;
bitmapImage . StreamSource = resource . Stream ;
bitmapImage . CacheOption = BitmapCacheOption . OnLoad ;
bitmapImage . EndInit ( ) ;
bitmapImage . Freeze ( ) ;
//... using s3pi ;
using s3pi . Interfaces ;
using s3pi . Package ;
//Open a package that contains a CASP resource
IPackage openedPackage = Package . OpenPackage ( 0 , "C:/Folder/clothes.package" , true ) ;
//Search the first CASP (or hex type 0x034AEECB) resource inside the package
foreach ( IResourceIndexEntry item in openedPackage . GetResourceList )
if ( GetLongConvertedToHexStr ( item . ResourceType , 8 ) == "0x034AEECB" )
{
//Get the CASP stream
Stream caspStream = WrapperDealer . GetResource ( 1 , openedPackage , item , true ) . Stream ;
//Get the CASP resource
CASPartResource . CASPartResource sourceCASpart = new CASPartResource . CASPartResource ( 1 , caspStream ) ;
//Allow this CASP for Random Sims
sourceCaspart . ClothingCategory |= CASPartResource . ClothingCategoryFlags . ValidForRandom ;
//Disallow this CASP for Random Sims
sourceCaspart . ClothingCategory &= ~ CASPartResource . ClothingCategoryFlags . ValidForRandom ;
//Delete the old CASP resource
openedPackage . DeleteResource ( item ) ;
//Add the new modified resource
openedPackage . AddResource ( ( ( IResourceKey ) item ) , ( ( AResource ) sourceCaspart ) . Stream , true ) ;
//Release streams
caspStream . Dispose ( ) ;
caspStream . Close ( ) ;
( ( AResource ) sourceCaspart ) . Stream . Dispose ( ) ;
( ( AResource ) sourceCaspart ) . Stream . Close ( ) ;
}
//Save the package and close it
openedPackage . SavePackage ( ) ;
Package . ClosePackage ( 0 , openedPackage ) ; Catatan
Di sini kami menggunakan WrapperDealer untuk mengakses sumber daya CASP, tetapi kami juga dapat menggunakan wrapper CASPartResource secara langsung untuk mengakses sumber daya CASP.
Seperti yang mungkin sudah Anda pahami, file paket sims seperti "file zip", yang berisi beberapa file lain di dalamnya. Setiap file/sumber daya di dalam file paket memiliki TGI yang terkait dengannya.
TGI pada dasarnya adalah jenis, grup, dan instance. Jenis dan grup ini adalah heksadesimal 8 digit, sedangkan contohnya adalah heksadesimal 16 digit. Untuk menghindari konflik antara sumber daya saat dimuat oleh permainan, setiap sumber daya yang ada di semua paket yang dimuat oleh game harus memiliki kombinasi TGI yang unik.
Saat Anda membuka file paket dengan S3PE, Anda dapat dengan mudah melihat jenis, grup, dan instance dari setiap sumber daya yang ada dalam paket yang dibuka. Sekarang setelah Anda mengetahui hal ini, perlu diingat bahwa saat mengedit file paket SIMS, Anda harus selalu memastikan bahwa sumber daya yang Anda masukkan ke dalam file paket harus selalu memiliki TGI yang unik.
Jika Anda memiliki pertanyaan lebih lanjut tentang ini, Anda dapat membaca artikel ini, yang membicarakan dan menjelaskan dengan sangat baik apa itu konflik mod, bagaimana mereka terjadi, bagaimana menyelesaikannya, dll.
Jika Anda telah membaca sejauh ini, Anda harus memiliki pemahaman yang layak tentang apa itu S3PI dan bagaimana menggunakannya. Jika Anda ingin mengakses repositori S3PI resmi lama, Anda dapat menggunakan tautan ini. Mengingat bahwa semua kredit untuk membuat Perpustakaan S3PI diberikan kepada Peter L Jones.
Repositori yang dibuat dengan oleh Marcos Tomaz