Jump to content

[WIPz] TES5Edit


zilav

Recommended Posts

I'm perusing the existing scripts looking for a means to qualify the script search, specifically the condition GetVMQuestVariable by quest (DialogueRiften "Riften Dialogue" [QUST:000368D8]) and CIS2 (::Dia07_var). Man-oh-man this is not obvious....

 

A general utility to find uses of variables would be handy, too. I can grep the Source for papyrus use, but there's no good way to find variables in CK.

 

EDIT: Actually, although not very good, I have found the variables in the CK -- but not per script. The developers sometimes seem to use generic numbered variables that have to be hand compared.

 

The actual problem I was having turned out to be I had loaded USKP, and USKP had removed the only condition for Dia07. Found it looking entry by entry in TES5Edit, but could have found it faster by loading only Update instead. (I've not found any related USKP Version History entry.)

Link to comment
Share on other sites

After reading it 3 times, still can't understand if you want something or already solved your issue :geek:
If you want to search for records that have conditions refering to provided variable name and provided quest, that can be arranged.

  • Like 1
Link to comment
Share on other sites

Yes, I've solved my immediate problem by doing it slowly by hand. Click on far left, click page down twice on far right margin,back and forth, repeated hundreds of times....

 

Yes, I'd like a script that searches conditions for a particular variable name on a particular quest/script. That would have been very handy, as the developers seem to use similar variable names for a lot of scripts.

Link to comment
Share on other sites

So I need to scan conditions on all records that references some quest, then check against variable name in condition, and then (optionally) check script properties attached to quest to match against given script name?

  • Like 1
Link to comment
Share on other sites

I was futily trying the other way around (checking the script name first because of the existing example), but yours would be nicer to only check script name in case of duplicate variable name (presumably a second run after the user discovers the duplicate). Cool!

Link to comment
Share on other sites

Uploaded new version.

Among several changes there is important fix that mostly affects TES4LODGen hanging that plagued it since version 3.0.15

  • Thanks 1
Link to comment
Share on other sites

I was futily trying the other way around (checking the script name first because of the existing example), but yours would be nicer to only check script name in case of duplicate variable name (presumably a second run after the user discovers the duplicate). Cool!

 

@Zilav and DayDreamer, I can make this script if you want.  I've got time.  :)

Link to comment
Share on other sites

@Zilav and DayDreamer, I can make this script if you want.  I've got time.  :)

Looking forward to it.

 

During betas, after testing that my fixes were implemented properly, is the time that I've been analyzing navmesh. The next script I'd need for that is to check each cell triangle with an Exterior[1,2,3] flag, look into the Exterior table, find the matching triangle, ensure it has an Exterior[1,2,3] flag, look into its Exterior table, and ensure that that points back to my triangle.

 

I've been doing this by hand: the CK doesn't show the Exterior[1,2,3] flags, but it does show the [navmesh,triangle] pair from the Exterior table. So I can walk back and forth across the green line manually to check that they are pointing at each other -- but it would be nice to have a script to find the bad ones everywhere all at once!!!

Link to comment
Share on other sites

During betas, after testing that my fixes were implemented properly, is the time that I've been analyzing navmesh. The next script I'd need for that is to check each cell triangle with an Exterior[1,2,3] flag, look into the Exterior table, find the matching triangle, ensure it has an Exterior[1,2,3] flag, look into its Exterior table, and ensure that that points back to my triangle.

Need more information, including example plugin or using vanilla navmeshes - what, where, how and when to check. Screenshots are welcomed. I don't know how navmeshes work, so what you wrote above doesn't have any meaning for me unfortunately, and I don't have enough free time to figure it out myself.
  • Like 1
Link to comment
Share on other sites

Need more information, including example plugin or using vanilla navmeshes - what, where, how and when to check. Screenshots are welcomed. I don't know how navmeshes work, so what you wrote above doesn't have any meaning for me unfortunately, and I don't have enough free time to figure it out myself.

Damn, thought I'd replied to this last week, but it was lost?!?!

function Process(e: IInterface): integer;
var
  tris, tri: IInterface;
  i: integer;
begin
  if Signature(e) <> 'NAVM' then
    Exit;
 
  tris := ElementByPath(e, 'NVNM\Triangles');
  for i := 0 to Pred(ElementCount(tris))
  do begin
    tri := ElementByIndex(tris, i);
    // flags 1, 2, or 3 is set
    if GetElementNativeValues(tri, 'Flags') and 7 <> 0
    then begin
      // look for matching tri in External Connections table

    end;
  end;
end;

How do I access/search the External Connections table? It looks like it has 3 fields. It should be simple, but I'm not getting it.

Link to comment
Share on other sites

This is a not working script, I tried to create it from your description, but nothing were matching up when running on vanilla skyrim navmeshes. That's why I asked for more information.

 

{
  Check that external connection triangles in navmeshes are pointing to each other
}
unit NavMeshCheckExternal;

//===========================================================================
function Initialize: integer;
begin
  if wbSimpleRecords then begin
    MessageDlg('Simple records must be unchecked in xEdit options', mtInformation, [mbOk], 0);
    Result := 1;
    Exit;
  end;
end;

//===========================================================================
// check that tri1 in navmesh navm1 points to tri2 in navmesh navm2
function CheckConnection(navm1, navm2: IInterface; tri1, tri2: integer): Boolean;
var
  tris, tri, exts, ext: IInterface;
  i, ExtCount: integer;
begin
  if Signature(navm1) <> 'NAVM' then
    Exit;
  tris := ElementByPath(navm1, 'NVNM\Triangles');
  exts := ElementByPath(navm1, 'NVNM\External Connections');
  ExtCount := 0;
  // iterate through triangles until we find tri1
  for i := 0 to Pred(ElementCount(tris)) do begin
    tri := ElementByIndex(tris, i);
    if i = tri1 then begin
      if GetElementNativeValues(tri, 'Flags') and 7 = 0 then begin
        AddMessage(Format('Referenced triangle %d in %s is not external!', [tri1, Name(navm1)]));
        Exit;
      end;
      ext := ElementByIndex(exts, ExtCount);
      AddMessage(Format('External idx=%d for tri=%d in %s', [ExtCount, tri1, Name(navm1)]));
      if (FormID(LinksTo(ElementByName(ext, 'Mesh'))) = FormID(navm2)) and (GetElementNativeValues(ext, 'Triangle') = tri2) then
        Result := True;
      Exit;
    end;
    // triangle has external connections?
    if GetElementNativeValues(tri, 'Flags') and 7 > 0 then
      Inc(ExtCount);
  end;

end;


//===========================================================================
function Process(e: IInterface): integer;
var
  tris, tri, exts, ext: IInterface;
  i, ExtCount: integer;
begin
  if Signature(e) <> 'NAVM' then
    Exit;
    
  tris := ElementByPath(e, 'NVNM\Triangles');
  exts := ElementByPath(e, 'NVNM\External Connections');
  ExtCount := 0;
  // iterate through triangles
  for i := 0 to Pred(ElementCount(tris)) do begin
    tri := ElementByIndex(tris, i);
    // triangle has external connections?
    if GetElementNativeValues(tri, 'Flags') and 7 > 0 then begin
      if ExtCount > Pred(ElementCount(exts)) then begin
        AddMessage(Format('Triangle %d doesn''t have an external connection!', [ExtCount]));
        Result := 1;
        Exit;
      end;
      ext := ElementByIndex(exts, ExtCount);
      //AddMessage(Format('Triangle %d is external', [ExtCount]));
      if not CheckConnection(LinksTo(ElementByName(ext, 'Mesh')), e, GetElementNativeValues(ext, 'Triangle'), i) then begin
        AddMessage(Format('Triangle %d is broken', [i]));
        Result := 1;
        Exit;
      end;
      Inc(ExtCount);
    end;
  end;
end;

end.
  • Like 1
Link to comment
Share on other sites

Thanks. Any idea when 3.0.32 will make it to a regular release?

Link to comment
Share on other sites

I don't know. Just slowly updating and fixing here and there.

3.0.31 is quite a good version without outstanding bugs, so don't feel like rushed to replace it. However since most updates are done by Hlp nowadays, perhaps he will decide when. Releasing means just grabbing a version from here and uploading on nexus, nothing else.

  • Like 1
Link to comment
Share on other sites

The issue 149 fix alone would justify it IMO. It's a bad thing to have the potential for your ONAM subrecords to get hosed by normal use of the program :P

Link to comment
Share on other sites

The issue 149 fix alone would justify it IMO. It's a bad thing to have the potential for your ONAM subrecords to get hosed by normal use of the program :P

To be honest, it's probably been there since introduction of ONAMs in FO3Edit.
  • Haha 1
Link to comment
Share on other sites


I'm hoping that you could help me out with what seems to be an error with the floating point precision of some sub-record types that xEdit handles.

 

A Nexus user by the name of Shurah posted on the comments thread for a Skyrim mod named Audio Overhaul for Skyrim that for certain Static Attenuation (dB) values in the BNAM sub-record of Sound Descriptor records, TES5Edit will use an incorrect value in two situations:

 

1) when the value is manually entered (by keyboard) in TES5Edit

2) when that Sound Descriptor records is Copied as Override into a new plugin

 

For an example of situation #1, if I manually change the value Static Attenuation value of any Sound Descriptor record in a plugin by typing 20.130000 into that value field, as soon as I hit the ENTER key, TES5Edit displays 20.120000, and if that plugin is saved and loaded into CK, the value is in fact set to 20.120000.

 

For an example of situation #2, please see this screenshot (click to enlarge):

 

fJ7N9Qrm.png

 

Here I'm making a very small test plugin in CK, where for the particular Sound Descriptor record shown, I've set the Static Attenuation value to 9.690000, which is one of the incremental stops if you drag the slider left to right.

 

When I Copy the record as an Override to a new "patch" plugin, you can see the value has been changed to 9.680000. If this patch plugin is saved in TES5Edit and then loaded in CK, the value will come up as 9.680000. Here's a screenshot showing that:

 

6yvBwvjm.png

 

Please note again, that TES5Edit / xEdit only seems to incorrectly record a small number of values - but most values are recorded correctly. The reason this was discovered by Shurah, though, is because of the 9.690000 value being one of the default slider steps in the CK.

 

He also states that 9.680000 would be an "invalid" value because he couldn't select it in CK, but I notice that you can choose any two decimal point number by using the mouse scroll wheel. So even 9.680000 should be an acceptable value - if anyone can confirm this I would be very grateful.

 

Anyhow, the incorrectly recorded values in TES5Edit / xEdit does seem like something worth investigating into, because it's a little worrying when you type a number that the program then immediately changes.

 

One last note on this bug (?) is that I could only found the same value changing behavior in only one other sub-record type, which is the Cloud Speed (RNAM/QNAM) entries in Weather records. I tried test with a bunch of other sub-record types that use floating point values and they all worked. I suppose there might be more sub-record types with the strange behavior, though.

 

If you need any more information / explanation about this, please let me know.

 

And thanks for all the work on such an amazingly useful program! 

 

Link to comment
Share on other sites

It is caused by floating point rounding and the fact that those fields are stored as scaled integers inside plugin. Besides 0.01 doesn't make difference anywhere.

  • Like 1
Link to comment
Share on other sites

On 3.0.32 I could merge the delimited types but as they have no practical use for xEdit at the moment, so maybe we can release a "most likely stable" 3.0.32, before I attempt xViewSaves. :innocent:

Also, for personal use, I added some more command line "autorun" (not uploaded yet), currently ESMify on and ESMify off, and I was thinking about providing a SortAndClean masters. (A recent change I made in FalloutNV GeckPU will definitvly lead to people registering unwanted masters in their esp :) ).

Link to comment
Share on other sites

Make the same change for CK and people will love you :bunny:

About ESMifying, how is it different to masterupdate and masterrestore? I'm curious.

  • Like 1
Link to comment
Share on other sites

Whenever you all feel that 3.0.32 is ready let me know.  I don't want to just the gun and release it too early.  I like the idea of having a 3.0.32 and then when you are ready to Beta test xViewSaves release it here as 3.0.33 more or less.

Link to comment
Share on other sites

It works on a single plugin, not your whole load order. In fact the bulk of the change is allowing to provide a specific plugin (or plugins) on the command line, the rest is the same code as master update/restore.

Link to comment
Share on other sites

Hi

 

I am seeing some severe slowdowns with r1573 when copying records.

 

For example "Copy as new record into..." Static from skyrim.esm into a new mod.

 

r1573 needs 10 minutes

[00:13] [stuff.esp] Adding master "Skyrim.esm"
[10:33] Copying done.

 

3.0.31 needs seconds

[00:15] [stuf1.esp] Adding master "Skyrim.esm"
[00:18] Copying done.

 

Thanks for all

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...