Hi there! You are currently browsing as a guest. Why not create an account? Then you get less ads, can thank creators, post feedback, keep a list of your favourites, and more!
Don't ask me, I just code
Original Poster
#1 Old 8th Aug 2009 at 2:36 PM Last edited by pljones : 20th Dec 2012 at 7:32 PM. Reason: fix broken link
Default s3pi library
This can now be obtained and supported via http://www.den.simlogical.com/denfo...php?topic=204.0
Advertisement
One horse disagreer of the Apocalypse
#2 Old 8th Aug 2009 at 5:27 PM Last edited by pljones : 16th Aug 2009 at 1:45 PM.
0906-20-1542

s3pi.sln now includes all projects in the library distribution... Hopefully you've got them all in the same relative location as I have!

CatalogResource
  • BugFix: Added
Code:
if (stream == null) stream = UnParse(); s.Position = 0;
  • to base class constructor; affects all catalog resources.

ComplateResource
  • No functional change, just reformatted the code to bring into line with CatalogResource, above.

NameMapResource
  • General: tidy up how a new NameMapResource gets constructed, greatly simplifying constructor.

ObjKeyResource
  • BugFix: Moved "s.Position = 0;" to be non-conditional.

ScriptResource
  • BugFix: Don't invert mask used to isolate low 9 bits. It doesn't work upside down.
  • General: tidy up how "Value" is generated so as not to make redundant Reflection calls

------------------------------------------------------
s3pi_0906-23-1502
Extensions:
  • Add "[Serializable]" attribute to TGIN to allow FE apps to serialize the structure.



DemoPlugins:
  • Rename DemoPlugins.txt to Helpers.txt
  • Use meaningful group id in Helpers.txt.
  • Don't try just running everything for DefaultResource



Core:
  • Package: Try to get the package last modified timestamp to update on Save().
  • IResourceIndexEntry, AResourceIndexEntry and ResourceIndexEntry all amended to allow delete flag to be cleared.



Other:
  • Minor packaging change

------------------------------------------------------
0906-27-1056 - Released 30 June[*] Package: "Always3" renamed "Indexversion"[*] Several CatalogResource classes have VPXY prefixed to IndexN fields.

------------------------------------------------------
0906-30-1628 (also released 30 June)[*] Constructors in CatalogResource reviewed to help ensure they don't error on WrapperDealer.CreateResource(0, ...).
[*] Also required changes to UnParse() methods, setting strings to empty (rather than null), byte arrays set to zero length rather than null. Correction to an error in TypeCode constructor.
[*] Also, because Reflection can't bind by type to constructors when using "null", don't have any two argument constructors except for .ctor(requestedAPI, stream).

------------------------------------------------------
0907-04-1205 Contains important fix to Catalog Resource wrapper
s3pi core
  • [#]Fix WrapperDealer so it can identify constructors by the type of their arguments. This means no more need to have unused parameters just to make the signature unique.
    [#]Convert DependentList<T> from ADependentList<T, U> to AHandlerList<T>
    [#]Fix FOURCC(string) - was off by one.
    [#]Rename "tgiOffset" parameter to "tgiPosn" as it's the position (not an offset)
    [#]New GenericRCOLResource wrapper
    [#]New CopyableMessageBox extra



CS System Classes
  • [#]Create AHandlerList<T> class, extending List<T>; requires an EventHandler through which changes to the list are notified



Extensions extra
  • [#]Oops: ignore spaces between fields



Catalog Resource
  • [#]Convert DependentList<T> from ADependentList<T, U> to AHandlerList<T>
    [#]No need for dummy parameter on constructor following fix to WrapperDealer.
    [#][color=red]Fixes:[/color]
    • TypeCode40 should write byte 0x40 in UnParse (not 0x20...).
    • Material: offset to final DWORD was off by sizeof(uint) in UnParse.
    • Material: Also added guard against writing to Unknown1 if MaterialType is 0x01.
    (Without these fixes, the wrapper was corrupting resources!!)



ObjKey Resource
  • [#]Convert DependentList<T> from ADependentList<T, U> to AHandlerList<T>



------------------------------------------------------
0907-09-1627
Another large batch of changes caused by actually using the library!

Txtc Resource Wrapper (Texture Compositor)
* New wrapper

Stbl Resource Wrapper (String Table)
* New wrapper

Script Resource Wrapper
* Correct AssemblyInfo (use s3pi details, not default values)
* Minor code consistency change: set stream position to 0 after UnParse() on dirty

ObjKey Resource Wrapper
* Key is now a class (AHandlerElement), not a struct
* New control code 0x04 (like 0x01, 0x02)
* Minor code consistency changes: set stream position to 0 after UnParse() on dirty; let DependentList's stream constructor do its thing

NameMap Resource Wrapper
* Minor code consistency changes: set stream position to 0 after UnParse() on dirty; make new resources dirty

Generic RCOL Resource Wrapper
* Change the IList<> interface to expose ChunkEntries, where a ChunkEntry is an AHandlerElement.
* Actually implement the IList<> interface rather than throw exceptions
* Actually implement the Resources field
* Actually implement the ARCOLBlock.Equals() method (virtual - compares the AsByte arrays)
* Minor code consistency changes: formatting; set stream position to 0 after UnParse() on dirty

Complate Resource Wrapper
* Minor code consistency change: set stream position to 0 after UnParse() on dirty

Catalog Resource Wrapper
* Minor code consistency change: formatting
* TypeCode40 should write byte 0x40 in UnParse (not 0x20...).
* Material: offset to final DWORD was off by sizeof(uint) in UnParse.
* Material: Added guard against writing to Unknown1 if MaterialType is 0x01.

Core library
* New StblResource wrapper
* New TxtcResource wrapper
* FOURCC(ulong) now returns big-endian string
* Allow CountedTGIBlockList constructors to be passed a max size
* DependentList stream-based constructors now don't cause change events (includes CountedTGIBlockList and TGIBlockList changes)
* Big and scary: allow readwrite access to current package from other processes; lock header during save
* Rename (private) method setAlways3 to setIndexversion (missed previously)

------------------------------------------------------
0907-13-2103 Released 14 July - Latest rev:174
Generic RCOL wrapper
Convert from an IList<> interface to a DependentList content field

Catalog Resources wrapper
Handle UnicodeBE strings using UnicodeBigEndian encoding
NameGUID can actually be updated

Package
Add readonly/readwrite option to OpenPackage.
Also put a guard on Lock/Unlock in case the package isn't a filestream.

AApiVersionedFields
Make Write7BitStr handle non-default encodings

------------------------------------------------------
0907-15-1046 -- important fix included - latest rev:177[*]Assembly signing finally removed properly (it wasn't being used by the tools, anyway)[*]Fixed compression. Many thanks to Tiger for helping out with testing.

------------------------------------------------------
0907-17-1619 Released 18 July -- latest rev:185
  • [#]AResource.DependentList<> / implementers
    • Pass the andler to child elements so they do signal changes (and can pass it on if need be).

    [#]RCOL
    • Return values regardless of the state of the object. Only crash and burn when state changes are attempted.
    • Ensure the right change handler is called so that the RCOL block knows it is dirty.

    [#]CatalogResource
    • Don't use IList<>, use a normal field for TGIBlockList.
    • Don't hide ContentFields behind IList<>; but do accept IList<> in constructors

------------------------------------------------------
0907-20-1828 Released 21 July -- latest rev:187

NameMapResource, StblResource: Implement "IDictionary" (non-generic) interface.

AApiVersionedFields: Allow derived types to override how to respond to Get/Set requests.

------------------------------------------------------
0907-21-1744 -- latest rev:190

Txtc
If you're doing your own Stream constructor, set elementHandler before Parse() and set handler after Parse().

ObjKey
If you're using the default Stream constructor, pass it the change handler.
Code consistency changes.

------------------------------------------------------
0907-24-1433 -- latest rev:195
(Hmph; SourceForge changed the File Release System -- took a while to figure out how to get the release note attached... Had to read the manual!! )

ObjKey
Component should be exposed as the Enum it is!

CatalogResource
CommonBlock.Unknown4 is Enum BuildBuyProductStatus flags
Object: Change Room, Function and Build flags to Enums
Object: Unknown14 is Enum SlotPlacement flags

AApiVersionedFields:
1) You can now access a value using dotted notation to get to nested fields.
2) The implementation now relies on GetProperties() rather than GetMethods() for getting properties.

TypedValue
Pretty printing of Enums now displays the hex first, then the Enum value.

------------------------------------------------------
0907-25-2107 -- latest rev:206 -- NOTE: SVN REORGANISATION

DemoPlugins
Helpers.txt allows "*" to match any value on Wrapper and index entry lines

Helpers.txt adds EditorIgnoreWriteTimestamp to have the write timestamp ignored for editors using files

New static Edit() method to pass in index entry, resource, editor command and flags for using quotes and ignoring write timestamp

Helpers.txt update with some helpful comments


CopyableMessageBox
This is now in a project called "CustomForms" and the svn repository has been reorganised. Future shared custom forms and widgets will live here, too, to keep it company.

CopyableMessageBox updated to a new method of determining how large to size the messsage box and to generate scroll bars when needed.

------------------------------------------------------
0907-26-0859 -- latest rev:207

DemoPlugins
Helpers.txt -- added s3pi STBL Resource Editor

------------------------------------------------------
0907-29-1800 -- latest rev:216
Big thanks to Tiger for supplying the new compression code for s3pi.

Overhaul compression:
- remove old debug code
- replace my compression with Tiger's (10x speed up)
- Split out the code for extracting a chunk from a package
into its own method. (Just in case...)

TxtcResource: tiny tweak to build.

ModularResource
New wrapper for MDLR resources.


CatalogResource
Make constructor like normal constructors - don't initialise common.
TypeCodeList was passing handler, rather than elementHandler in CreateElement.

All classes inheriting from CatalogResource
UnParse() - check for common == null and initialise if required.

WallFloorPatternCatalogResource
WallFloorPatternMaterial has three unknowns, not one.

------------------------------------------------------
0908-06-1025 -- latest rev: 223

CopyableMessageBox now works when there is no OpenForm.

Extensions.txt -- added CFND for Catalog Foundations. (There's still no wrapper.)

CatalogResource:
- Change Value to emit CommonBlock, then simple fields, then complicated fields.
- Make CatalogResource.Value aware of WallFloorPatternCatalogResource's specialised MaterialList, thus removing need for override in WallFloorPatternCatalogResource and hence need to maintain code in two places.

ModularResource:
- Oops: need to create tgiBlocks before writing them (when creating resource).
- Unknown3 onward replaced with a list of DWORDs (unknown3 was the count).

"You can do refraction by raymarching through the depth buffer" (c. Reddeyfish 2017)
Don't ask me, I just code
Original Poster
#3 Old 17th Aug 2009 at 11:26 AM
0908-16-2102 Released 16 August -- latest rev: 228

Add facialblend to Extensions.

Trap exceptions in ScriptResource when loading embedded assembly.

New FTPT RCOL chunk.

Helpers.txt updated to assume ViewDDS in on search path.
Don't ask me, I just code
Original Poster
#4 Old 27th Sep 2009 at 11:22 AM
0909-27-1115 (at last) -- latest rev: 273

TGIBlockCombo added to CustomForms: for editing TGIBlockList index values; pass it a TGIBlockList and an index number. Allows selecting a list entry and editing the list (through TGIBlockListEditor).

TGIBlockListEditor added to CustomForms: Pass it a TGIBlockList and it will edit it.

ResourceTypeCombo added to CustomForms: it's the Tag/Type box originally used in the ResourceDetails panel.

Fix numbering of CopyableMessageBox buttons.

Substantial changes to the Helpers.txt syntax; more generic approach, providing "Helper1" and "Helper2".
Update Helpers.txt: Don't enable GIMP by default; use MSPAINT for JPEGs.
Update Helpers.txt for S3PE VPXY Resource Editor.
Update Helpers.txt quote GIMP's arguments.
Update Helpers.txt for S3PE OBJK Resource Editor.

FTPT: Amend constructor to support CreateRCOLBlock.
FTPT: New constructor for adding ARCOLBlocks.
FTPT: Moved AreaType down a bit.
FTPT: Correctly accept any old IList<PolygonPoint> for constructing closedPolygon.
VPXY: Amend constructor to support CreateRCOLBlock.
VPXY: Oops. Cloning was omiting the TGIBlockList.
VPXY: New constructor for adding ARCOLBlocks.
VPXY: Entry class rewritten as abstract, subtypes Entry00 and Entry01. EntryList updated to support AResource.DependentList<T>.Add(...)
VPXY: Rewrite list elements to behave correctly in s3pe.
DefaultRCOL: Comment added to indicate no CreateRCOLBlock support.
DefaultRCOL: Minor changes (comment, case of hex)

GenericRCOL: Extend GenericRCOLResourceHandler to have CreateRCOLBlock(int APIversion, EventHandler handler, uint type). Finds the appropriate RCOL chunk constructor and returns a new entry.
GenericRCOL: Extend GenericRCOLResourceHandler to have RCOLDealer(int APIversion, EventHandler handler, uint type, params object[] fields). Finds the appropriate RCOL chunk handler, binds to a constructor (including the "fields" types) and invokes it. Original RCOLDealer tidied up in line with new code.

ARCOLBlock: AsBytes and Data tagged with ElementPriority.
ARCOLBlock: Add Setter to AsBytes; add a BinaryReader for the RCOL chunk.

CatalogResource: TypeCodeList updated to support AResource.DependentList<T>.Add(...)
OBJK: ComponentDataList updated to support AResource.DependentList<T>.Add(...); tidy up Value; ComponentList "HasComponent" and "Find" methods.
ObjKeyResource: rewritten to match updated Wiki entry.
TXTC: EntryList updated to support AResource.DependentList<T>.Add(...)
TXTC: Rewrite list elements to behave correctly in s3pe.

Update with Tiger's latest compression code. Includes >16M fix.

AApiVersionedFields now supports versioning (permissively - not mandatory).
Change comment to remove indication versioning not implemented.
AResource.TGIBlock fields tagged in TGI order with ElementPriority.
New ElementPriorityAttribute: used (e.g.) by s3piPropertyGrid to sort content fields.
Extend AResource.DependentList<T> to have Add(params object[] fields). This determines the appropriate constructor to call for T (or a subtype of T if T is abstract), creates a new instance with the supplied values and adds it to the list. Lists of abstract classes must override GetElementType(params object[] fields) and return the correct type. There must be a constructor that takes the list of fields supplied (with the types exactly as supplied, due to Binding), prefixed by int APIversion and an EventHandler.
Extend AResource.DependentList<T> to require an Add() method on concrete classes. (Lists of abstract classes should throw a NotImplementedException().)
(Updated all implementors appropriately.)
Code consistency: "public new virtual" not "public virtual new".

Remove empty "RunPostBuildEvent" that causes warnings sometimes.
Don't ask me, I just code
Original Poster
#5 Old 10th Oct 2009 at 3:18 PM
0910-10-1448 -- latest rev: 275

Catalog Resource TypeCode01 fix.
0x40 always means read next byte.
0x80 toggles between string table lookup (clear) or literal string in stream (set).
StringTable is a shared resource, so added to Interfaces.
Don't ask me, I just code
Original Poster
#6 Old 26th Oct 2009 at 10:45 AM
0910-26-0933 -- latest rev: 276

Need to pass OnRCOLChanged as the handler to lists inside RCOLs, not the RCOL resource changed handler.
Don't ask me, I just code
Original Poster
#7 Old 1st Nov 2009 at 10:13 AM
0910-31-2006 -- latest rev: 278 (Released 1 November)

Backout broken fix for CatalogResource TypeCode01. Was corrupting textures

Return ContentFields in sorted order.
Don't ask me, I just code
Original Poster
#8 Old 1st Nov 2009 at 3:48 PM
0911-01-1534 -- latest rev: 279

Reimplement fix for CatalogResource TypeCode01.
Don't ask me, I just code
Original Poster
#9 Old 26th Nov 2009 at 2:31 PM
0911-25-1727 Released 26 November -- latest rev: 293

Interfaces:
* Add new interface (IResourceKey) and abstract class (AResourceKey) to handle splitting out of EPFlags (an enum, defined in IResourceKey.cs) from ResourceGroup.
* IResourceIndexEntry becomes an extension of IResourceKey.
* Change AResourceIndexEntry to extend AResourceKey and implement IResourceIndexEntry. Note that AResourceIndexEntry is not a well-behaved instance of AHandlerEntry.
* Change AResource.TGIBlock to extend AResourceKey.
* AddResource on IPackage and APackage now requires an IResourceKey argument in place of Type, Group and Instance numbers.

Package:
* ResourceIndexEntry now implements EpFlags (required by AResourceIndexEntry); ResourceGroup amended to only return low 24-bits of Group.
* Package entries are now added by IResourceKey, rather than Type, Group, Instance. The index can also be accessed by ResourceKey (which ignores EpFlags), by TGI as before and with EpFlags plus TGI.

Extras - Extensions:
* TGIN updated to understand AResourceKey (conversions).
Extras - DemoPlugins:
* Amended to use IResourceKey rather than IResourceIndexEntry for keyword names.
Extras - CustomForms:
* Add support for EpFlags to TGIBlockListEditor.

CatalogResource.cs:
CatalogResource
* unknown1 from all resources renamed to version and added directly to the CatalogResource abstract class
* new .ctor on CatalogResource to pass in version
* virtual Parse(Stream) method, replacing abstract Parse method, to parse the version
* virtual UnParse() method, replacing abstract Parse method, writes out the version and returns a Stream to the caller
* Version content field to access the version attribute
* CatalogResource CommonBlock unknown1 becomes version number and can now be 0x0c or 0x0d; the new version has an extra byte (unknown4).
* CatalogResource TypeCode01 now removes "ControlCode" from ContentFields if prefix is null (fixes S3PE Grid display error).

CatalogResourceTGIBlockList
* .ctor with TGIBlockList now requires version to be passed, too
* new Parse(Stream) method to read tgiPosn and tgiSize, calls CatalogResource.Parse()
* new UnParse() method, calls CatalogResource.UnParse(), pads for tgiPosn and tgiSize
* UnParse(s, pos) no longer takes pos parameter -- this is determined in UnParse()

FenceCatalogResource.cs
* Amended to migrate local "unknown1" to "version" on CatalogResource
* New MaterialList attribute for version >= 0x00000007
* .ctor calls to base() pass version
* Clone .ctor amended to handle MaterialList
* New .ctor with MaterialList argument added
* Old .ctor calls new .ctor with null MaterialList and checks version is okay for omitting

list
* Amended to utilise base.Parse(Stream) and base.UnParse() appropriately
* Parse/UnParse for MaterialList
* Override ContentFields getter to remove Materials Content Field if version < 0x07
* Add get/set methods for Materials

FireplaceCatalogResource.cs
* Amended to migrate local "unknown1" to "version" on CatalogResource
* .ctor calls to base() pass version
* Amended to utilise base.Parse(Stream) and base.UnParse() appropriately

ObjectCatalogResource.cs
* Amended to migrate local "unknown1" to "version" on CatalogResource
* New string attribute (reusing freed up "unknown1" variable) for version >= 0x00000016
* .ctor calls to base() pass version
* Clone .ctor amended to handle new unknown1
* New .ctor with new unknown1 argument added
* Old .ctor calls new .ctor with null new unknown1 and checks version is okay for omitting

string
* Amended to utilise base.Parse(Stream) and base.UnParse() appropriately
* Took out some commented out code in Parse and UnParse
* Override ContentFields getter to remove Unknown1 Content Field if version < 0x16
* Add get/set methods for Unknown1

ProxyProductCatalogResource.cs
* Amended to migrate local "unknown1" to "version" on CatalogResource
* .ctor calls to base() pass version
* Amended to utilise base.Parse(Stream) and base.UnParse() appropriately

RailingCatalogResource.cs
* Amended to migrate local "unknown1" to "version" on CatalogResource
* New MaterialList attribute for version >= 0x00000003
* .ctor calls to base() pass version
* Clone .ctor amended to handle MaterialList
* New .ctor with MaterialList argument added
* Old .ctor calls new .ctor with null MaterialList and checks version is okay for omitting

list
* Amended to utilise base.Parse(Stream) and base.UnParse() appropriately
* Parse/UnParse for MaterialList
* Override ContentFields getter to remove Materials Content Field if version < 0x03
* Add get/set methods for Materials

RoofPatternCatalogResource.cs
* Amended to migrate local "unknown1" to "version" on CatalogResource
* .ctor calls to base() pass version
* Amended to utilise base.Parse(Stream) and base.UnParse() appropriately

RoofStyleCatalogResource.cs
* Amended to migrate local "unknown1" to "version" on CatalogResource
* .ctor calls to base() pass version
* Amended to utilise base.Parse(Stream) and base.UnParse() appropriately

StairCatalogResource.cs
* Amended to migrate local "unknown1" to "version" on CatalogResource
* New MaterialList attribute for version >= 0x00000003
* .ctor calls to base() pass version
* Clone .ctor amended to handle MaterialList
* New .ctor with MaterialList argument added
* Old .ctor calls new .ctor with null MaterialList and checks version is okay for omitting

list
* Amended to utilise base.Parse(Stream) and base.UnParse() appropriately
* Parse/UnParse for MaterialList
* Override ContentFields getter to remove Materials Content Field if version < 0x03
* Add get/set methods for Materials

TerrainGeometryWaterBrushCatalogResource.cs
* Amended to migrate local "unknown1" to "version" on CatalogResource
* .ctor calls to base() pass version
* Amended to utilise base.Parse(Stream) and base.UnParse() appropriately
* Move unknown2 arg on .ctor before Common, as that's the natural order

TerrainPaintBrushCatalogResource.cs
* .ctor calls to base() pass version
* Move unknown2 arg on .ctor before Common, as that's the natural order

WallCatalogResource.cs
* Amended to migrate local "unknown1" to "version" on CatalogResource
* .ctor calls to base() pass version
* Amended to utilise base.Parse(Stream) and base.UnParse() appropriately
* Move unknown2 arg on .ctor before Common, as that's the natural order

WallFloorPatternCatalogResource.cs
* Amended to migrate local "unknown1" to "version" on CatalogResource
* .ctor calls to base() pass version
* Amended to utilise base.Parse(Stream) and base.UnParse() appropriately

StblResource.cs
Work-around for problems in Patch 1.6 STBL files (duplicate strings).
Don't ask me, I just code
Original Poster
#10 Old 10th Dec 2009 at 6:37 PM Last edited by pljones : 10th Dec 2009 at 7:55 PM.
0912-10-1829 -- latest rev: 297

Interfaces: New DataGridExpandableAttribute to indicate a collection should be shown as expandable instead of a popup in the S3PE Grid.

GenericRCOL: Slight change to Value formatting.
GenericRCOL: try{}catch{} around each class instantiation as well as around each dll load.
GenericRCOL: New MATD RCOL chunk handler.

Txtc: Check position of TGI block; set offset to TGI block correctly. (Fixes "blue lotting")

Many thanks to Delphy for spotting what was wrong and getting back to us so fast! Apologies for the mess this has cause content creators.
Don't ask me, I just code
Original Poster
#11 Old 13th Dec 2009 at 5:48 PM
0912-13-1103 -- latest rev: 298

CatalogResource: Check that we've processed through to the end of the resource. This will help with spotting changes sooner.
CatalogResource: TerrainPaintBrushCatalogResource version 4 extra field processing.
Don't ask me, I just code
Original Poster
#12 Old 13th Mar 2010 at 10:06 AM
1002-22-1731 -- Released 13 March 2010 -- latest rev: 385

Fix TGIBlockList editor.
Update to VS2010.
Rewrite DemoPlugins: split Helpers.txt into Helpers/*.helper.
------------
1002-19-1755
latest rev: 368

TxtcResource: Friendlier formatting of Entry lists.
TxtcResource: Entry subClasses for all DataTypes created.
TxtcResource: Entry subclasses now manage their own Property.

ContentCategoryFlags removed from IResourceKey and all deriving classes, etc.
------------
1002-19-1029
latest rev: 365

New RCOL Chunk handler: MTST
VPXY.cs: minor fix to ensure "dirty" processing works.
TxtcResource.cs: rename enum entries from Colour to Color to match hash values.
ScriptResource.cs: Fix - handle empty assembly data more elegantly.
Attribute doc-comments corrections.

New ConstructorParametersAttribute: Specify the constructor parameters for a descendant of an abstract class
CatalogResource.cs: Apply [ConstructorParameters] to TypeCodes
CatalogResource.cs: Give TypeCodeNN classes more meaningful names
CatalogResource.cs: Apply [ElementPriority] to TCRGBA properties.
WallFloorPatternCatalogResource.cs: Give TypeCodeNN classes more meaningful names.
ObjKeyResource.cs: Apply [ElementPriorty] to ComponentDataTypes
ObjKeyResource.cs: Include typename in S3PE preview for ComponentDataTypes
ObjKeyResource.cs: Apply [ConstructorParameters] to ComponentDataTypes.
TxtcResource.cs: Property attribute should be a Properties enum
TxtcResource.cs: Apply [ElementPriorty] to Entry classes.
TxtcResource.cs: Apply [ConstructorParameters] to Entry classes.


Rename EPFlags to ContentCategoryFlags.
------------
1002-07-1311
latest rev: 353

CustomForms: TGIBlockListEditor: Oops: Clear the list when the form is created.
CustomForms: CopyableMessageBox: Move code to own folder for consistency.
CustomForms: Tidy up public face of CopyableMessageBox.
CustomForms: Move "IssueException()" method from RunHelper to CopyableMessageBox.
DemoPlugins: RunHelper.cs: Move "IssueException()" method to CopyableMessageBox.
DemoPlugins: DemoPlugins.cs: Use CopyableMessageBox.IssueException() method.

Settings.cs: New AsBytesWorkaround setting, set to "true", used to bypass "dirty" processing when flushing Stream property.
Interfaces.csproj: Add reference to Settings.
AResource.cs: AResource now requires UnParse() to be defined in implementers
AResource.cs: Default Stream property implements "if (dirty ...) { ... }" behaviour.
AApiVersionedFields.cs: AHandlerElement now provides "dirty" tracking through OnElementChanged().


CatalogResource: Fix TypeCode so it removes ControlCode from ContentFields when null.
CatalogResource: Use OnResourceChanged after .ctor with null stream.
ModularResource: Use OnResourceChanged after .ctor with null stream.
NameMapResource: Use OnResourceChanged after .ctor with null stream.
ObjKeyResource: Use OnResourceChanged after .ctor with null stream.
ScriptResource: Exception handling amended to work like CopyableMessageBox.IssueException().
ScriptResource: Use OnResourceChanged after .ctor with null stream.
StblResource: Use OnResourceChanged after .ctor with null stream.

DefaultResource.cs: AResource UnParse not used, Stream returns stream.
ImageResource.cs: AResource UnParse not used, Stream returns stream.
TextResource.cs: AResource UnParse not used, Stream returns stream.

ComplateResource.cs: Update for changes in AResource.

TxtcResource: Move creation of EntryList entries into EntryList.

ARCOLBlock.cs: Use dirty tracking through OnElementChanged().
GenericRCOLResource: Rewrite ChunkEntryList creation to ensure elementHandler is correctly set on elements.
GenericRCOLResource: Use OnResourceChanged after .ctor with null stream.

DefaultRCOL.cs: Avoid raising change events in .ctor.
FTPT.cs: Avoid raising change events in .ctor.
VPXT.cs: Avoid raising change events in .ctor.

MATD.cs: Avoid raising change events in .ctor.
MATD.cs: MTNF and MTRL elements should have OnRCOLChanged handler.
------------
1001-16-1636
latest rev: 327

GenericRCOLResource.cs:
Start each RCOL chunk on a four-byte boundary.

MATD.cs:
Correct writing of offsets within ShaderData EntryLists.
Add checking of offsets within ShaderData EntryLists.
Amend EntryList stream constructor to manage the element handler correctly.
------------
1001-10-1726
latest rev: 324

CatalogResource.cs: TypeCode01: Constructor must allow string to be null.
------------
1001-02-1833
latest rev: 323

TerrainGeometryWaterBrushCatalogResource: Rename Unknown8 to BrushIndex for the field that associates a brush with its pair (really only applies to CTPT rather than CWAT).

DemoPlugins: Add "RunHelper" class and "IRunHelper" interface. RunHelper.Run() accepts a Form/IRunHelper type and a parameter list (of strings). The parameter list is parsed for either /clipboard or a filename. The Form is then invoked with a Stream reference to the clipboard or file data. If Environment.ExitCode is zero, the clipboard or file are then updated with IRunHelper.Result.
DemoPlugins: Oops, didn't quite get the not using clipboard for Plugins change right. Here's "Take 2".
DemoPlugins: Oops: res.Stream.Position is never where you want it; write the whole resource to the file.
Helpers.txt: Pass resources by file ("{}") rather than clipboard to S3PE editors.
Helpers.txt: Put quotes around filenames, too.
Helpers.txt: Add a note about putting quotes around filenames.

TGIComboBox: Oops, SelectedIndexChanged event not being raised when GUI used to change selected index.

s3pi:
- Start adding XML documentation to CS System Classes, Custom Forms and s3pi.Interfaces
- Removed (commented out) a couple of unused methods from AApiVersionedFields
- Tidied up XML doc comments in various places
IGenericAdd.cs: Include Add(params object[]) in interface declaration
AResource.cs: mark Add(params object[]) as virtual
AResource.cs: AHandlerElements should be passed to their own constructors with apiversion and handler
AResource.cs: TGIBlock: add constructor that takes a TGIBlock
AResource.cs: TGIBlock: amend Clone(..) to call constructor passing "this"
AResource.cs: TGIBlockList: amend Add() to call Add(..) with "bare" constructor arguments (not create an object)

Wrappers:
(Most of these changes are to comply with "AResource.cs: AHandlerElements should be passed to their own constructors with apiversion and handler" above.)
CatalogResource.cs: Common: constructor that gets passed a Common block, calls this(...)
CatalogResource.cs: Common: constructor that gets passed individual fields, correct names of version (from unknown1) and buildBuyProductStatusFlags (from unknown4) in argument list
CatalogResource.cs: TypeCode01-7/2F/40: new constructor that gets passed a TypeCode01-7/2F/40
CatalogResource.cs: TypeCode01-7/2F/40: amend Clone(..) to call constructor passing "this"
CatalogResource.cs: TypeCodeList: GetElementType might get passed a TypeCode object, so just return its type
CatalogResource.cs: MaterialBlock: constructor that gets passed a MaterialBlock, calls this(...)
CatalogResource.cs: MaterialBlockList: amend Add() to call Add(..) with "bare" constructor arguments (not create an object)
CatalogResource.cs: MaterialList: amend Add() to call Add(..) with "bare" constructor arguments (not create an object)
ObjectCatalogResource.cs: MTDoor: constructor that gets passed an MTDoor, calls this(...)
ObjectCatalogResource.cs: MTDoorList: amend Add() to call Add(..) with "bare" constructor arguments (not create an object)
WallFloorPatternCatalogResource.cs: WallFloorPatternMaterialList: amend Add() to call Add(..) with "bare" constructor arguments (not create an object)
GenericRCOLResource.cs: ChunkEntry: new constructor that gets passed a ChunkEntry
GenericRCOLResource.cs: ChunkEntry: constructor that gets passed individual fields, clone the lists!
GenericRCOLResource.cs: ChunkEntry: amend Clone(..) to call constructor passing "this"
FTPT.cs: PolygonPoint: constructor that gets passed a PolygonPoint, calls this(...)
FTPT.cs: PolygonPointList: amend Add() to call Add(..) with "bare" constructor arguments (not create an object)
FTPT.cs: Area: constructor that gets passed an Area, calls this(...)
FTPT.cs: AreaList: amend Add() to call Add(..) with "bare" constructor arguments (not create an object)
MATD.cs: ElementUInt32: new constructor that gets passed an ElementUInt32
MATD.cs: ElementUInt32: amend Clone(..) to call constructor passing "this"
MATD.cs: ElementSingle: new constructor that gets passed an ElementSingle
MATD.cs: ElementSingle: amend Clone(..) to call constructor passing "this"
MATD.cs: EntryList: Add support for IGenericAdd interface
MATD.cs: ShaderData: constructor that gets passed a ShaderData, calls this(...)
MATD.cs: ShaderDataList: Parse() should only be called from a constructor, so don't call Clear()
MATD.cs: ShaderDataList: Parse() should call this.Add(..) than base.Add(..)
MATD.cs: ShaderDataList: Parse() can call Add(Stream)
MATD.cs: ShaderDataList: Add() cannot add an entry as it has no idea what type is needed
VPXY.cs: Constructor that gets passed a VPXY, calls this(...)
VPXY.cs: ElementUInt32: new constructor that gets passed an ElementUInt32
VPXY.cs: ElementUInt32: amend Clone(..) to call constructor passing "this"
VPXY.cs: UintList: amend Add() to call Add(..) with "bare" constructor arguments (not create an object)
VPXY.cs: Entry00: new constructor that gets passed an Entry00
VPXY.cs: Entry00: amend Clone(..) to call constructor passing "this"
VPXY.cs: Entry01: new constructor that gets passed an Entry01
VPXY.cs: Entry01: amend Clone(..) to call constructor passing "this"
VPXY.cs: EntryList: GetElementType might get passed an Entry object, so just return its type
ModularResource.cs: TGIIndex: new constructor that gets passed a TGIIndex
ModularResource.cs: TGIIndex: amend Clone(..) to call constructor passing "this"
ObjKeyResource.cs: ComponentElement: new constructor that gets passed a ComponentElement
ObjKeyResource.cs: ComponentElement: amend Clone(..) to call constructor passing "this"
ObjKeyResource.cs: ComponentDataType subClasses: new constructor that gets passed a ComponentDataType subClass instance
ObjKeyResource.cs: ComponentDataType subClasses: amend Clone(..) to call constructor passing "this"
ObjKeyResource.cs: ComponentDataList: GetElementType might get passed an ComponentDataType object, so just return its type
TxtxResource.cs: SuperBlock: constructor that gets passed a SuperBlock, calls this(...)
TxtxResource.cs: Entry subClasses: new constructor that gets passed an Entry subClass instance
TxtxResource.cs: Entry subClasses: amend Clone(..) to call constructor passing "this"
TxtxResource.cs: EntryList: GetElementType might get passed an Entry object, so just return its type
TxtxResource.cs: EntryBlock: make constructor that gets passed an EntryBlock public
Locked thread
Back to top