1+ using CATHODE . Scripting ;
2+ using CathodeLib ;
3+ using Newtonsoft . Json ;
4+ using System ;
5+ using System . Collections . Generic ;
6+ using System . IO ;
7+ using System . Runtime . InteropServices ;
8+
9+ namespace CATHODE
10+ {
11+ /* DATA/ENV/PRODUCTION/x/WORLD/CHARACTERACCESSORYSETS.BIN */
12+ public class CharacterAccessorySets : CathodeFile
13+ {
14+ public List < Entry > Entries = new List < Entry > ( ) ;
15+ public static new Implementation Implementation = Implementation . CREATE | Implementation . LOAD | Implementation . SAVE ;
16+ public CharacterAccessorySets ( string path ) : base ( path ) { }
17+
18+ #region FILE_IO
19+ override protected bool LoadInternal ( )
20+ {
21+ using ( BinaryReader reader = new BinaryReader ( File . OpenRead ( _filepath ) ) )
22+ {
23+ reader . BaseStream . Position = 4 ;
24+ int entryCount = reader . ReadInt32 ( ) ;
25+ for ( int i = 0 ; i < entryCount ; i ++ )
26+ {
27+ Entry entry = new Entry ( ) ;
28+ entry . character = Utilities . Consume < CommandsEntityReference > ( reader ) ;
29+
30+ entry . shirt_composite = Utilities . Consume < ShortGuid > ( reader ) ;
31+ entry . trousers_composite = Utilities . Consume < ShortGuid > ( reader ) ;
32+ entry . shoes_composite = Utilities . Consume < ShortGuid > ( reader ) ;
33+ entry . head_composite = Utilities . Consume < ShortGuid > ( reader ) ;
34+ entry . arms_composite = Utilities . Consume < ShortGuid > ( reader ) ;
35+ entry . collision_composite = Utilities . Consume < ShortGuid > ( reader ) ;
36+
37+ entry . unk1 = reader . ReadInt32 ( ) ;
38+
39+ entry . unk2 = reader . ReadInt32 ( ) ;
40+ entry . unk3 = reader . ReadInt32 ( ) ;
41+ entry . unk4 = reader . ReadInt32 ( ) ;
42+ entry . unk5 = reader . ReadInt32 ( ) ;
43+ entry . unk6 = reader . ReadInt32 ( ) ;
44+ entry . decal = ( Entry . Decal ) reader . ReadInt32 ( ) ;
45+ entry . unk8 = reader . ReadInt32 ( ) ;
46+ entry . unk9 = reader . ReadInt32 ( ) ;
47+ entry . unk10 = reader . ReadInt32 ( ) ;
48+ entry . unk11 = reader . ReadInt32 ( ) ;
49+
50+ byte [ ] stringBlock = reader . ReadBytes ( 260 ) ;
51+ entry . face_skeleton = Utilities . ReadString ( stringBlock ) ;
52+ stringBlock = reader . ReadBytes ( 260 ) ;
53+ entry . body_skeleton = Utilities . ReadString ( stringBlock ) ;
54+
55+ entry . unk12 = reader . ReadInt32 ( ) ;
56+ entry . unk13 = reader . ReadInt32 ( ) ;
57+ entry . unk14 = reader . ReadInt32 ( ) ;
58+ Entries . Add ( entry ) ;
59+ }
60+ }
61+ return true ;
62+ }
63+
64+ override protected bool SaveInternal ( )
65+ {
66+ using ( BinaryWriter writer = new BinaryWriter ( File . OpenWrite ( _filepath ) ) )
67+ {
68+ writer . BaseStream . SetLength ( 0 ) ;
69+ writer . Write ( 20 ) ;
70+ writer . Write ( Entries . Count ) ;
71+ for ( int i = 0 ; i < Entries . Count ; i ++ )
72+ {
73+ Utilities . Write ( writer , Entries [ i ] . character ) ;
74+
75+ Utilities . Write ( writer , Entries [ i ] . shirt_composite ) ;
76+ Utilities . Write ( writer , Entries [ i ] . trousers_composite ) ;
77+ Utilities . Write ( writer , Entries [ i ] . shoes_composite ) ;
78+ Utilities . Write ( writer , Entries [ i ] . head_composite ) ;
79+ Utilities . Write ( writer , Entries [ i ] . arms_composite ) ;
80+ Utilities . Write ( writer , Entries [ i ] . collision_composite ) ;
81+
82+ writer . Write ( Entries [ i ] . unk1 ) ;
83+ writer . Write ( Entries [ i ] . unk2 ) ;
84+ writer . Write ( Entries [ i ] . unk3 ) ;
85+ writer . Write ( Entries [ i ] . unk4 ) ;
86+ writer . Write ( Entries [ i ] . unk5 ) ;
87+ writer . Write ( Entries [ i ] . unk6 ) ;
88+ writer . Write ( ( Int32 ) Entries [ i ] . decal ) ;
89+ writer . Write ( Entries [ i ] . unk8 ) ;
90+ writer . Write ( Entries [ i ] . unk9 ) ;
91+ writer . Write ( Entries [ i ] . unk10 ) ;
92+ writer . Write ( Entries [ i ] . unk11 ) ;
93+
94+ writer . Write ( new byte [ 260 ] ) ;
95+ writer . BaseStream . Position -= 260 ;
96+ Utilities . WriteString ( Entries [ i ] . face_skeleton , writer , false ) ;
97+ writer . BaseStream . Position += 260 - Entries [ i ] . face_skeleton . Length ;
98+ writer . Write ( new byte [ 260 ] ) ;
99+ writer . BaseStream . Position -= 260 ;
100+ Utilities . WriteString ( Entries [ i ] . body_skeleton , writer , false ) ;
101+ writer . BaseStream . Position += 260 - Entries [ i ] . body_skeleton . Length ;
102+
103+ writer . Write ( Entries [ i ] . unk12 ) ;
104+ writer . Write ( Entries [ i ] . unk13 ) ;
105+ writer . Write ( Entries [ i ] . unk14 ) ;
106+ }
107+ }
108+ return true ;
109+ }
110+ #endregion
111+
112+ #region STRUCTURES
113+ public class Entry
114+ {
115+ public CommandsEntityReference character = new CommandsEntityReference ( ) ;
116+
117+ public ShortGuid shirt_composite = ShortGuid . Invalid ;
118+ public ShortGuid trousers_composite = ShortGuid . Invalid ;
119+ public ShortGuid shoes_composite = ShortGuid . Invalid ;
120+ public ShortGuid head_composite = ShortGuid . Invalid ;
121+ public ShortGuid arms_composite = ShortGuid . Invalid ;
122+ public ShortGuid collision_composite = ShortGuid . Invalid ;
123+
124+ public int unk1 = 0 ;
125+ public int unk2 = 1 ;
126+ public int unk3 = 2 ;
127+ public int unk4 = 3 ; //This is often odd values
128+ public int unk5 = 4 ;
129+ public int unk6 = 5 ;
130+
131+ public Decal decal = Decal . MEDICAL ; //TODO: Is this decal texture defined by CUSTOMCHARACTERASSETDATA.BIN?
132+
133+ public int unk8 = 0 ;
134+ public int unk9 = 0 ;
135+ public int unk10 = 1 ;
136+ public int unk11 = 0 ;
137+
138+ public string face_skeleton = "AL" ;
139+ public string body_skeleton = "MALE" ;
140+
141+ public int unk12 = 3 ;
142+ public int unk13 = 6 ;
143+ public int unk14 = 9 ;
144+
145+ public enum Decal
146+ {
147+ MEDICAL ,
148+ ENGINEERING ,
149+ GENERIC ,
150+ TECHNICAL ,
151+ }
152+ } ;
153+ #endregion
154+ }
155+ }
0 commit comments