func (d *Data) Export() { if d.CasPartFile == "" { d.inform(casPartFileMissing) return } if d.ThumbFile == "" { d.inform(thumbFileMissing) return } if d.ExportDir == "" { d.inform(exportDirMissing) return } casPartPack, err := dbpf.Open(trimPath(d.CasPartFile)) if err != nil { d.report(err) return } thumbPack, err := dbpf.Open(trimPath(d.ThumbFile)) if err != nil { d.report(err) return } folder := trimPath(d.ExportDir) casParts := make([]uint64, 0) casPartNames := make(map[uint64]string) for k, r := range casPartPack.ListResources(&keys.Filter{[]uint32{consts.ResourceTypeCasPart}, nil, nil}, nil, nil) { data, err := r.ToBytes() if err != nil { d.report(err) return } casPart, err := caspart.Read(data) if err != nil { d.report(err) return } casParts = append(casParts, k.Instance) casPartNames[k.Instance] = casPart.Name } count := 0 for k, r := range thumbPack.ListResources(&keys.Filter{nil, []uint32{consts.ResourceGroupPortraitFemale, consts.ResourceGroupPortraitMale}, casParts}, nil, nil) { data, err := r.ToBytes() if err != nil { d.report(err) return } thumb, err := thumbnail.Convert(data) if err != nil { d.report(err) return } file, err := os.Create(fmt.Sprintf("%v/%v_%x.png", folder, casPartNames[k.Instance], k.Group)) if err != nil { d.report(err) return } _, err = file.Write(thumb) if err != nil { d.report(err) file.Close() return } file.Close() count++ } d.inform(fmt.Sprintf("Extraction completed, %v thumbnails extracted.", count)) }
func loadCasPartNames(folder string) (map[int]string, error) { infos, err := ioutil.ReadDir(folder) if err != nil { return nil, err } addons := make([]string, 0) for _, info := range infos { if !info.IsDir() { continue } if isPack(info.Name()) { addons = append(addons, info.Name()) } } filter := &keys.Filter{[]uint32{consts.ResourceTypeCasPart}, nil, nil} pack, err := dbpf.Open(fmt.Sprintf("%v/Data/Client/ClientFullBuild0.package", folder)) if err != nil { return nil, err } list := pack.ListResources(filter, nil, nil) pack, err = dbpf.Open(fmt.Sprintf("%v/Data/Client/ClientDeltaBuild0.package", folder)) if err != nil { return nil, err } list = pack.ListResources(filter, nil, list) for _, addon := range addons { pack, err = dbpf.Open(fmt.Sprintf("%v/%v/ClientFullBuild0.package", folder, addon)) if err != nil { fmt.Println(err) continue } list = pack.ListResources(filter, nil, list) pack, err = dbpf.Open(fmt.Sprintf("%v/Delta/%v/ClientDeltaBuild0.package", folder, addon)) if err != nil { fmt.Println(err) continue } list = pack.ListResources(filter, nil, list) } names := make(map[int]string) for k, r := range list { data, err := r.ToBytes() if err != nil { fmt.Println(err) continue } part, err := caspart.Read(data) if err != nil { fmt.Println(err) continue } names[int(k.Instance)] = part.Name } return names, nil }