Jump to content

[WIP] Bash Tagger (detects up to 49 bash tags!)


fireundubh

Recommended Posts

BROKEN. WAIT FOR V1.3.8.

v1.3.7 is up. Changelog:

  • Requires xEdit svn1872 or later. Download here.
  • In xEdit, "show values of flags and enumerations" must be disabled. This option is disabled by default.
  • C.Name, C.Music, and several other tags were not generating correctly. They are now.
  • Internal: ConflictAllForMainRecord and ConflictAllForElements are used to determine which records to evaluate.
  • Internal: GetElement has replaced ElementBySignature, ElementByName, ElementByPath, and ElementByIP.
  • Internal: Evaluate is a wrapper for Validate that uses GetElement. Less opportunity for typos.
  • Internal: Flags are evaluated with the new xEdit function FlagValues. No more GetNativeValue errors!
  • Internal: Most debug messages are produced by ShowDebugMessagesFromString or ShowDebugMessagesFromElement. Mouthfuls, argh.

With the FlagValues function, you should also see less tags. For example:
 
v1.3.6:

YUP - Base Game + All DLC.esm:
Suggested tags: 
{{BASH:Actors.ACBS,Actors.DeathItem,C.Owner,C.Water,Delev,Destructible,Factions,Graphics,Hair,Invent,Names,Relations,Relev,Scripts,SpellStats,Stats}}

v1.3.7:

YUP - Base Game + All DLC.esm:
Suggested tags: 
{{BASH:C.Owner,Delev,Destructible,Graphics,Hair,Invent,Relev,SpellStats,Stats}}

Remember to load only one plugin at a time. The plugin for which you want to generate tags should be the last plugin in the xEdit load order.

Edited by fireundubh
Link to comment
Share on other sites

Keep in mind that FlagValues() and EnumValues() return the full list of possible flags, not the current set ones of an element. However flag values are sorted in the order of bits, so a first string is a flag name for bit 0, second for bit 1, etc.

EnumValues() are not "ordinals" in that sense, so a first string doesn't mean the integer value of 0. However you don't need to know the internal integer values for enumerations since you can use names when setting or getting edit values of enum elements.

 

You can also use ConflictAllForElements() on flag and enum elements, let xEdit decide if they conflict or not.

Edited by zilav
Link to comment
Share on other sites

Unofficial Skyrim Patch.esp:

Suggested tags:

{{BASH:C.Light,C.Owner,Delev,Graphics,Invent,Relev,Stats}}

 

Expected Result:

 

{{BASH:C.Acoustic,C.Climate,C.Encounter,C.ImageSpace,C.Light,C.Location,C.Music,C.Name,C.Owner,C.Water,Delev,Graphics,Invent,Names,Relev,Sound,Stats}}

Link to comment
Share on other sites

Keep in mind that FlagValues() and EnumValues() return the full list of possible flags, not the current set ones of an element.

Oh, crap. LOL

 

By the way, per my post in the TES5Edit comments, SortKey appears to be broken in the latest builds.

AddMessage(SortKey(ElementByName(e, 'Items'), True));
 
xEdit svn1872:
0005D7FF|||000B41A1|||000C499C||
 
xEdit svn1866:
0005D7FF|||000B41A1|||000C499C||
 
xEdit svn1864:
0005D7FF|||000B41A1|||000C499C||
 
xEdit svn1839:
0005D7FF|080000002||000B41A1|080000001||000C499C|080000001|

I also noticed that GetNativeValue started throwing errors when trying to read flag elements. Maybe other things are broken, too?

 

And I don't understand how to make use of FlagValues.

Edited by fireundubh
Link to comment
Share on other sites

Unofficial Skyrim Patch.esp:

Suggested tags:

{{BASH:C.Light,C.Owner,Delev,Graphics,Invent,Relev,Stats}}

 

Expected Result:

 

{{BASH:C.Acoustic,C.Climate,C.Encounter,C.ImageSpace,C.Light,C.Location,C.Music,C.Name,C.Owner,C.Water,Delev,Graphics,Invent,Names,Relev,Sound,Stats}}

Okay, in v1.3.8, this is what I get now.

Unofficial Skyrim Patch.esp:
Suggested tags: 
{{BASH:C.Climate,C.Encounter,C.Light,C.Location,C.Owner,C.RecordFlags,Delev,Graphics,Invent,Names,Relev,Sound,Stats}}
C.Music should be there, too.

WindhelmBloodworks "Windhelm Barracks" [CELL:0001677A]

 

C.Name as well.

WindhelmPalaceUpstairs02 "Palace of the Kings, Upstairs" [CELL:00097298]

 

And C.ImageSpace.

WhiterunJail02 "Guard Barracks" [CELL:000580A2]

 

I don't see anything warranting C.Acoustic.

 

Anyway, I figured out what was happening.

 

And voila.

Unofficial Skyrim Patch.esp:
Suggested tags: 
{{BASH:C.Climate,C.Encounter,C.ImageSpace,C.Light,C.Location,C.Music,C.Name,C.Owner,C.RecordFlags,C.Water,Delev,Graphics,Invent,Names,Relev,Sound,Stats}}
But more testing is needed.

YUP - Base Game + All DLC.esm:
Suggested tags: 
{{BASH:Actors.ACBS,Actors.AIData,Actors.CombatStyle,Actors.DeathItem,Actors.Skeleton,Actors.Stats,C.Owner,C.Water,Delev,Destructible,Factions,Graphics,Hair,Invent,Names,Relations,Relev,Scripts,Sound,SpellStats,Stats}}
That looks crazy. Edited by fireundubh
Link to comment
Share on other sites

v1.3.8 is up. Changelog:

  • No longer broken. Hooray. This is the most important point. That's why I made it first.
  • No longer requires latest xEdit. See next bullet.
  • Revived some code from v1.3.6. No idea how to use FlagValues and EnumValues anyway.
  • No longer processes the file header while looking for tags. One less record to process = 10,000% speed bonus.
  • Better conflict detection. Weird things were happening. Not anymore.
  • Better flag checking. Actually checks flags that are set, not flags that exist.
  • Better flag error handling. Checks if the flag element exists before checking the flags. Overkill, badly written, but my mouse has a double click problem and that's a lot of code to minimize.
  • Better universal GetElement. It was broken, so of course it's better now.
  • Factions: The validator uses SortKeys now, which is faster than iterating through each faction. When it's not broken.
  • Graphics: DNAM\Material is validated, but I may have forgotten to make that exclusive to Skyrim. Oh, well.
  • Tag Writing: If you choose to write tags to the file header, and no tags are suggested, say goodbye to your file header description field.
Link to comment
Share on other sites

Using 1.3.8 on Unofficial Skyrim Patch.esp

 

Suggested tags:

{{BASH:C.Climate,C.Encounter,C.ImageSpace,C.Light,C.Location,C.Music,C.Name,C.Owner,C.RecordFlags,C.Water,Delev,Graphics,Invent,Names,Relev,Sound,Stats}}

 

I now feel this is probably the closest to being correct so far.  I'll need to check that though. I can't find any XCAS subrecords in the USKP that are different from Skyrim.esm or Update.esm.  I can't figure out how to alter Zilav's Apply custom scripted filter.pas so that it looks at CELL records and then makes the Result true only when there is a change in the XCAS record. I wish I could but I did filter for just CELL, and chose Hide No Conflict Rows. That let me look at the CELL records and I just didn't see any changes in XCAS.

 

C.RecordFlags

 

Basic Wrye Bash definitions for Record header. Mine is extremely different for my Experimental version.

 

( 0,'esm'),
( 5,'deleted'),
( 6,'borderRegion'),
( 7,'turnFireOff'),
( 7,'hasStrings'),
( 9,'castsShadows'),
(10,'questItem'),
(10,'persistent'),
(11,'initiallyDisabled'),
(12,'ignored'),
(15,'visibleWhenDistant'),
(17,'dangerous'),
(18,'compressed'),
(19,'cantWait'),
 

CBash's Code for the record header in reference to flags1

 

    IsDeleted = CBashBasicFlag('flags1', 0x00000020)
    IsBorderRegion = CBashBasicFlag('flags1', 0x00000040)
    IsTurnOffFire = CBashBasicFlag('flags1', 0x00000080)
    IsCastsShadows = CBashBasicFlag('flags1', 0x00000200)
    IsPersistent = CBashBasicFlag('flags1', 0x00000400)
    IsInitiallyDisabled = CBashBasicFlag('flags1', 0x00000800)
    IsIgnored = CBashBasicFlag('flags1', 0x00001000)
    IsVisibleWhenDistant = CBashBasicFlag('flags1', 0x00008000)
    IsDangerousOrOffLimits = CBashBasicFlag('flags1', 0x00020000)
    IsCompressed = CBashBasicFlag('flags1', 0x00040000)
    IsCantWait = CBashBasicFlag('flags1', 0x00080000)
The fact that the script is adding C.RecordFlags, is because there are a lot of records in USKP where the main record header has Compressed and that flag was not present in Skyrim.esm.  The CK compresses the record when it wants to.  I think we thought there was a specific set of circumstances but we have found that the CK sets the flag and compresses the record, regardless of whether or not it met the criteria we thought should trigger the record to be compressed.

 

I'll keep testing it on other plugins. Thanks for the updates.

Edited by Sharlikran
Link to comment
Share on other sites

My C.RecordFlags processor looks at all cell record flags, so maybe I should target just the ones you listed.

Also, this is how I set up the filter:

fz57Sk4.png

Then I went into the view pane, right clicked, and hit "hide no conflict rows." That makes it pretty easy to go down the list manually.

I could write a script to find cells with just that element changed, but eh, I don't know if I'd trust it. ;)

Link to comment
Share on other sites

At the risk of exposing my ignorance to the masses, if someone was only ever using WB to generate a bashed patch, will this tool eventually be used to assist xEdit to apply these tags and generate a 'bashed' patch from within xEdit? Or am I completely missing the purpose of this tool?

 

Since one of the major functions of WB is the management of mods and that is now handled by MO with STEP users, as I see it the only other function left with WB, and the only reason why I have it installed at this moment, is to generate bashed patches. If that too can be handled by another more robust tool, such as xEdit, why the need for WB and its variants? 

Link to comment
Share on other sites

I'm currently using this tool to generate potential bash tags for the mods in the Clear and Present Danger Fallout 3 guide. It has found a number of potential bash tags that I didn't previously identify, and it does this a lot faster than I can do manually. I'm reviewing these to see which of these tags improve the resulting bashed patch for the mods in the guide . For the past few months I have been submitting bash tags to the LOOT team for inclusion in the LOOT masterlist, so as I identify additional useful bash tags I submit them to LOOT (EssArrBee is doing a similar effort for the mods in his Fallout NV guide). Once Wrye Flash is able to automatically read the bash tags in the LOOT masterlist, then users will find almost all the bash tags they need already populated in Wrye Flash (at least for the mods in the Fallout 3 guide).

Link to comment
Share on other sites

At the risk of exposing my ignorance to the masses, if someone was only ever using WB to generate a bashed patch, will this tool eventually be used to assist xEdit to apply these tags and generate a 'bashed' patch from within xEdit? Or am I completely missing the purpose of this tool?

 

Since one of the major functions of WB is the management of mods and that is now handled by MO with STEP users, as I see it the only other function left with WB, and the only reason why I have it installed at this moment, is to generate bashed patches. If that too can be handled by another more robust tool, such as xEdit, why the need for WB and its variants? 

 

Creating a bashed patch with an xEdit script, while possible, would probably take at least 20 minutes for 100-200 plugins. I'm probably being overly optimistic about that number, too.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site, you agree to our Guidelines, Privacy Policy, and Terms of Use.