Jump to content

Recommended Posts

3 hours ago, gooser said:

Sure, all ears.

 

Was looking at Meh's .Net framework skse plugin actually.

Everything is pretty much already available for you without much work needed.

 

JSON Parser: Multiple open source libraries for C/C++ around so I won't recommend one directly. Just search for some and see which one performs the best and/or has the most pleasing semantics for you.

Pseudo random algorithm: The C++ standard now includes (since C++11) some of the most popular ones. I recommend Mersenne Twister for this. It's relatively fast and produces high quality randomness.

Communication with the widget: SKSE already defines functions for getting/setting action script variables and executing action script functions. Take a look at the following functions from PapyrusUI.cpp::papyrusUI to understand how to do the same with your plugin: SetT, GetT, InvokeArgT, InvokeArrayT and InvokeForm.

 

Now all that is needed is to create a Papyrus wrapper and register it, something like:

Function ShowMessage(string file, Actor primary, Actor active, int[] params) global native

params should be a fixed-length array with stuff like arousal and wear and tear, passing -1 when unused as to tell the plugin it shouldn't format that parameter into the final string.

 

C++:

void ShowMessage(StaticFunctionTag* thisInput, BSFixedString file, Actor* primary, Actor* active, VMArray<SInt32> params)
{
    std::string filename(file.data);

    std::string primaryName(primary->GetFullName());
    std::string activeName(active->GetFullName());

    SInt32 arousal = -1;
    SInt32 wt      = -1;

    if (params.Length() >= 1)
        params.Get(&arousal, 0);
    if (params.Length() >= 2)
        params.Get(&wt, 1);

    // Parse and format json here. Optionally caching some of the files at plugin load.
    std::string msg;

    // Acquire lock.
    // Send the formatted string to the action script.
    papyrusUI::InvokeArgT<BSFixedString>(nullptr, "CustomMenu", "_root.Apropos.QueueMessage", msg.c_str());
    // Release lock.
}

As you can see, the string is read, formatted and sent directly to the action script from the plugin without ever going through the PapyrusVM.

Link to comment
17 hours ago, Skarab said:

Good point, however he obviously has {QUIVERING}, rather than {QUIVER} in his synonyms.txt

My bad, I copy-pasted the wrong line from my Synonyms.txt *facepalm* It's there:

"{QUIVER}": ["quiver", "shiver", "shudder", "spasm", "tremor"],

 

Thanks for the replies btw, you guys are awesome.

 

I'm gonna go with the dirty solution for now but if gooser really decides to go for a pure c++ method, that would be super-awesome!

Link to comment
15 hours ago, Malos323 said:

Are there any descriptions for mind-control related ones?

 

I know the Daedra ones have it but with about things like the Anubs Animation Mind Control animations.etc

I've added a few of these here and there in the database in the last few months.  Stuff like, "as he chants some bizarre spell my mind turns off".

I've avoided writing content for specific animations so far, but it feels like I'm getting close to the end of my planned/necessary content updates, and will soon be able to work on stuff just because I want to.

Link to comment
7 hours ago, Eadoo said:

I've added a few of these here and there in the database in the last few months.  Stuff like, "as he chants some bizarre spell my mind turns off".

I've avoided writing content for specific animations so far, but it feels like I'm getting close to the end of my planned/necessary content updates, and will soon be able to work on stuff just because I want to.

I would like detailed ones.

IMHO, for mind control/hypnosis, 1st and 2nd person would likely be the same but with I/You swapped

Aka "You/I need [SUBJECT]'s cock" "You/I am a slut".etc

and 3rd person would describe it like third person

Link to comment
29 minutes ago, Malos323 said:

I would like detailed ones.

IMHO, for mind control/hypnosis, 1st and 2nd person would likely be the same but with I/You swapped

Aka "You/I need [SUBJECT]'s cock" "You/I am a slut".etc

and 3rd person would describe it like third person

Typically if I am writing a Mindbreak situation or similar loss of control, I with write 3rd person, even in 1st person descriptions, to give the sense that they have "departed" and no longer view themselves subjectively.

Link to comment
13 hours ago, King-Crimson said:

I'm gonna go with the dirty solution for now but if gooser really decides to go for a pure c++ method, that would be super-awesome!

From now on, every solution given by me in these forums should be referred to as the "Google vomit" solution. :)

 

Anyway, if you are going for that, I've written a script to do that automatically.

Simply place it in your Apropos/db folder and double-click it. Make sure to only run it once or you will mangle the synonym tokens further each time.

 

Example output:

ERROR: .\FemaleActor\FemaleActor_VirginityLost_Oral.txt -> Expecting , delimiter: line 17 column 2 (char 1052)
ERROR: .\FemaleActor_Bear\FemaleActor_Bear_Vaginal_Rape_Stage1.txt -> No JSON object could be decoded
ERROR: .\FemaleActor_Deer\FemaleActor_Deer_Vaginal_Stage5.txt -> No JSON object could be decoded
ERROR: .\FemaleActor_Female\FemaleActor_Female_Handjob_Stage5.txt -> Expecting , delimiter: line 18 column 68 (char 1246)
ERROR: .\FemaleActor_Female\FemaleActor_Female_Oral_Rape_Stage3.txt -> No JSON object could be decoded
ERROR: .\FemaleActor_Male\FemaleActor_Male_HandJob_Stage3.txt -> No JSON objectcould be decoded
ERROR: .\FemaleActor_Mammoth\FemaleActor_Mammoth_Vaginal_Stage1.txt -> No JSON object could be decoded
ERROR: .\FemaleActor_Mammoth\FemaleActor_Mammoth_Vaginal_Stage3.txt -> No JSON object could be decoded

[*] All done!
[*] 78 synonym(s) prefixed in 3110 file(s) with 8 error(s).

Press any key to continue . . .

prefix_synonyms.py

Link to comment
3 hours ago, Malos323 said:

I would like detailed ones.

IMHO, for mind control/hypnosis, 1st and 2nd person would likely be the same but with I/You swapped

Aka "You/I need [SUBJECT]'s cock" "You/I am a slut".etc

and 3rd person would describe it like third person

If you're willing to write it, I'm willing to put it into my DB.

Otherwise you'll have to wait for me to get around to it...probably around the end of this year or the beginning of next.

Link to comment
2 hours ago, Hawk9969 said:

 


ERROR: .\FemaleActor\FemaleActor_VirginityLost_Oral.txt -> Expecting , delimiter: line 17 column 2 (char 1052)
ERROR: .\FemaleActor_Female\FemaleActor_Female_Handjob_Stage5.txt -> Expecting , delimiter: line 18 column 68 (char 1246)

 

LOL...don't mind me!  These errors DEFINITELY aren't MY fault and I refuse to fix them!

Hrm...*cough* *cough*.

...clickity clickity clickity...

Link to comment
1 hour ago, Eadoo said:

LOL...don't mind me!  These errors DEFINITELY aren't MY fault and I refuse to fix them!

Hrm...*cough* *cough*.

...clickity clickity clickity...

All of them have issues, but I only fixed 4 of those because I've no need to fix the beastiality stuff as my game doesn't have any.

Quote

ERROR: .\FemaleActor_Female\FemaleActor_Female_Oral_Rape_Stage3.txt -> No JSON object could be decoded

Last text of "3rd Person" has a trailing comma. Simply removing it fixes the file.

Quote

ERROR: .\FemaleActor_Male\FemaleActor_Male_HandJob_Stage3.txt -> No JSON objectcould be decoded

Line 7 is broken. The text starts without quotes and then quotes are added mid text.

Link to comment
1 hour ago, Hawk9969 said:

All of them have issues, but I only fixed 4 of those because I've no need to fix the beastiality stuff as my game doesn't have any.

Last text of "3rd Person" has a trailing comma. Simply removing it fixes the file.

Line 7 is broken. The text starts without quotes and then quotes are added mid text.

Uh...Gooser told me to do it that way!  To see if anyone was paying attention!

That is...IF I did it at all.  

You can't prove it!

 

(but seriously, thanks, I'll get those fixed)

Link to comment
9 hours ago, Eadoo said:

Uh...Gooser told me to do it that way!  To see if anyone was paying attention!

That is...IF I did it at all.  

You can't prove it!

 

(but seriously, thanks, I'll get those fixed)

Ha!

Link to comment
17 hours ago, Hawk9969 said:

Anyway, if you are going for that, I've written a script to do that automatically.

 

 

Oh, thanks, but I've already made a regex and fired up sed on Linux to do that for me ?

I haven't commented on the C++ code above but I'm an IT-guy (of all trades) myself ;)

Link to comment
41 minutes ago, King-Crimson said:

 

Oh, thanks, but I've already made a regex and fired up sed on Linux to do that for me ?

I haven't commented on the C++ code above but I'm an IT-guy (of all trades) myself ;)

You just didn't replace everything inside curly brackets, right? Because there are some tokens that are not synonyms, and some ({PRIMARY}, {ACTIVE}) that can't be prefixed because they are hardcoded.

The way I did it was by reading Synonyms.txt, building a dictionary from the tokens (key = non-prefixed token, value = prefixed token), replacing the tokens within Synonyms.txt and then replacing the tokens within the texts.

Link to comment
16 hours ago, Hawk9969 said:

You just didn't replace everything inside curly brackets, right? Because there are some tokens that are not synonyms, and some ({PRIMARY}, {ACTIVE}) that can't be prefixed because they are hardcoded.

The way I did it was by reading Synonyms.txt, building a dictionary from the tokens (key = non-prefixed token, value = prefixed token), replacing the tokens within Synonyms.txt and then replacing the tokens within the texts.

Don't worry, I'm not that dumb :P

Link to comment

Here is more Google vomit from me.

 

So... turns out that trick to prevent caching didn't work for me.

Spoiler

2003557569_enb2020_05_2221_31_53_36.png.5d0c18b3d86776f54068480f2b3b96d0.png

I went ahead, attached a debugger and took a look at BSFixedString's ctor. Below is what I've reverse-engineered so far.

Spoiler

BSFixedString::BSFixedString(const char* s)
{
    this->data = nullptr;

    if (s == nullptr)
        return;

    UInt32 hash;
    std::size_t size = HashString(s, &hash);

    void* cache = nullptr;
    CacheString(size, hash, s, &cache);
    this->data = (const char*)(((UInt32)cache) + 0x0C);
}

std::size_t HashString(const char* s, UInt32* hash)
{
    std::size_t size = std::strlen(s);
    *hash = 0;

    if (!size)
        return 0;

    for (std::size_t i = 0; i < size; i++)
    {
        char c = s[i];

        if (c >= 'a' && c <= 'z')
            // Make lower case characters upper case.
            c -= 0x20; // Machine code does += 0xE0 to overflow into upper case.

        UInt32 u32 = (UInt32)c;
        u32 ^= *hash;
        u32 &= 0xFF;

        *hash >>= 8;
        *hash ^= (UInt32)*((UInt16*)((u32 << 1) + (TESV+0xD0D830))); // TESV+0xD0D830 == CRC16 lookup table
    }

    return size;
}

 

I've not reverse-engineered the CacheString function yet other than its calling convention and parameters as that function is pretty big and I was getting bored/lazy.

I did however reverse-engineer the StringHash function which doesn't show any signs of fragmenting pieces of a string. It's worrisome however, that Bethesda used CRC16 (a maximum of 65536 unique hashes) for string hashes; the chance of collision is pretty big considering how many strings get stored.

 

Ok, so I tried a different approach by mangling synonym tokens from "{SYNONYM}" to "{S|Y|N|O|N|Y|M}" and it still gets cached with all letters uppercased.

 

Finally, I've decided to do a wide search on all my Skyrim files for ASCII references of "QUIVER". Papyrus script wise, I've found it on Race Menu and XPMSE scripts.

string Property NINODE_QUIVER = "QUIVER" AutoReadOnly

Other than that I could find it in HKX and NIF strings, although I am unsure whether those are cached or not.

 

I could try patching out this:

        if (c >= 'a' && c <= 'z')
            // Make lower case characters upper case.
            c -= 0x20; // Machine code does += 0xE0 to overflow into upper case.

To cache strings case-sensitively.

However, I am pretty sure I'll break a lot of mods that rely on those being cached case-insensitively (maybe even vanilla stuff).

 

*Sigh* Seems, like the only solution (clean or not) is to use C++ to read, format and send strings, which obviously, I am not going to do as it requires restructuring all of the scripts that format/send messages.

Link to comment
1 hour ago, Hawk9969 said:

Here is more Google vomit from me.

 

So... turns out that trick to prevent caching didn't work for me.

  Reveal hidden contents

2003557569_enb2020_05_2221_31_53_36.png.5d0c18b3d86776f54068480f2b3b96d0.png

I went ahead, attached a debugger and took a look at BSFixedString's ctor. Below is what I've reverse-engineered so far.

  Reveal hidden contents


BSFixedString::BSFixedString(const char* s)
{
    this->data = nullptr;

    if (s == nullptr)
        return;

    UInt32 hash;
    std::size_t size = HashString(s, &hash);

    void* cache = nullptr;

    CacheString(size, hash, s, &cache);

    ...
      
    this->data = (const char*)(((UInt32)cache) + 0x0C);
}

std::size_t HashString(const char* s, UInt32* hash)
{
    std::size_t size = std::strlen(s);
    *hash = 0;

    if (!size)
        return 0;

    for (std::size_t i = 0; i < size; i++)
    {
        char c = s[i];

        if (c >= 'a' && c <= 'z')
            // Make lower case characters upper case.
            c -= 0x20; // Machine code does += 0xE0 to overflow into upper case.

        UInt32 u32 = (UInt32)c;

        // [BUG]
        // movsx is used instead of movzx.
        // This might crash the game if a non ASCII char is found (ISO-8859-1, etc).
        // At the very least, it will display a wrong character.
        if (c < 0)
            u32 |= 0xFFFFFF00;
        // [/BUG]

        u32 ^= *hash;
        u32 &= 0xFF;
        *hash >>= 8;
        *hash ^= (UInt32)*((UInt16*)((u32 << 1) + (TESV+0xD0D830))); // TESV+0xD0D830 == CRC16 lookup table
    }

    return size;
}

 

I've not reverse-engineered the CacheString function yet other than its calling convention and parameters as that function is pretty big and I was getting bored/lazy.

I did however reverse-engineer the StringHash function which doesn't show any signs of fragmenting pieces of a string. It's worrisome however, that Bethesda used CRC16 (a maximum of 65536 unique hashes) for string hashes; the chance of collision is pretty big considering how many strings get stored.

 

Ok, so I tried a different approach by mangling synonym tokens from "{SYNONYM}" to "{S|Y|N|O|N|Y|M}" and it still gets cached with all letters uppercased.

 

Finally, I've decided to do a wide search on all my Skyrim files for ASCII references of "QUIVER". Papyrus script wise, I've found it on Race Menu and XPMSE scripts.


string Property NINODE_QUIVER = "QUIVER" AutoReadOnly

Other than that I could find it in HKX and NIF strings, although I am unsure whether those are cached or not.

 

I could try patching out this:


        if (c >= 'a' && c <= 'z')
            // Make lower case characters upper case.
            c -= 0x20; // Machine code does += 0xE0 to overflow into upper case.

To cache strings case-sensitively.

However, I am pretty sure I'll break a lot of mods that rely on those being cached case-insensitively (maybe even vanilla stuff).

 

*Sigh* Seems, like the only solution (clean or not) is to use C++ to read, format and send strings, which obviously, I am not going to do as it requires restructuring all of the scripts that format/send messages.

Another solution would be for me to just remove all of the words that do this from Synonyms.txt.  It will, in general, reduce the quality of the database, but I think it's an acceptable resolution, especially as I turn my eyes to the magic 1.0 release 6-9 months from now.

That will probably actually come out 5 years from now.  :)

 

Of course, if it gets fixed in code, then hooray!  Otherwise, I need to smooth out the language generated by the DB anyways (read: remove words that frequently result in oh so strange phrases), so I might as well prune words for other reasons then, as well.

Link to comment
1 hour ago, Eadoo said:

Another solution would be for me to just remove all of the words that do this from Synonyms.txt

Not a good solution because this depends entirely on your Skyrim load. In this case, assuming "QUIVER" doesn't get cached from NIF and HKX strings, had I not been using RaceMenu and XPMSE, I wouldn't have any issues with "quiver".

I did mention in my initial post that the dirty solution wouldn't work if it was cached by vanilla Skyrim or other mods, I just wanted to confirm whether Skyrim cached strings as a whole or allowed for fragments.

Ala, whether it did something like this:

Spoiler

const char* CacheString(const char* s)
{
    std::string buffer(s);

    auto it = std::search(g_StringCache.cbegin(), g_StringCache.cend(), buffer.cbegin(), buffer.cend(),
    [](char cc, char cb) -> bool
    {
        return std::tolower(cc) == std::tolower(cb);
    });

    if (it == g_StringCache.cend())
        g_StringCache += buffer;

    return &(*it);
}

 

 

 

To be honest, I am quite worried about them using CRC16... Fuckin Bethesda, I wonder how many collisions have the average modded Skyrim player gotten thus far without even realizing it.

Meanwhile, CDPR used FNV1a64 for most of their hashing requiring fast computation, where they've a maximum theoretical 18446744073709551616 unique hashes, vs CRC16, with a maximum theoretical 65536 unique hashes.

Link to comment
7 hours ago, Hawk9969 said:

Not a good solution because this depends entirely on your Skyrim load.

Far from an expert, so this may be true, but I've run Apropos with a very heavy mod load for years and have only ever seen this behavior with a single batch of words:

 

tttCapture.JPG.0b79d291874ac060d1ccc70ef285f8c6.JPG

 

... now QUIVER isn't listed there, but it isn't hard to imagine it shares the same associations to body slot identifiers.

 

I've personally not seen it do the all-caps thing with anything not directly associated with this list.  Hands and body not being accessible is... problematic in this context, but still avoidable in many cases.

 

Thinking through it though, it may also have to do with skeletal nodes as I recall BREAST doing this once as well.  Dunno.

Link to comment
11 hours ago, Seijin8 said:

Far from an expert, so this may be true, but I've run Apropos with a very heavy mod load for years and have only ever seen this behavior with a single batch of words:

Anything that caches the string and doesn't allow the reference count to drop to 0 (and thus preventing the engine from releasing it) is going to show this problem. As I've shown, RaceMenu and XPMSE have properties which will remain active until you return to the main menu, and those get cached as soon as the scripts get initialized, far before Apropos reads the Synonyms json.

More over, anything that uses BSFixedString is going to cache strings, that includes but is not limited to, Papyrus strings, INI settings, ESP/ESM string parameters, etc.

 

You can take a look at your cached strings pretty easily.

  1. Attach a debugger. Cheat Engine is a good user friendly one for this.
  2. Set a breakpoint at "TESV.exe+651201".
  3. Once the breakpoint triggers, copy the address stored at EAX (this is the cached data of this string).
  4. Right click the memory viewer, click "Go to address" and input the address you've just copied from EAX.

I've set a breakpoint in there with readString(EAX) == "QUIVER" as its trigger condition, got the address, removed the breakpoint and allowed my save to fully load.

After it fully loaded, I then went to the address from above and looked at the cache structure.

   3D 00       44 AC                06 00 00 00                 51 55 49 56 45 52 00
[ REF COUNT ] [ HASH ] [ LENGTH - NULL CHARACTER NOT COUNTED ] [Q  U  I  V  E  R  \0]

REFERENCES:
>>> 0x003D
61

STRING:
>>> "".join(chr(c) for c in (0x51,0x55,0x49,0x56,0x45,0x52))
'QUIVER'

It only started caching "QUIVER" when loading a save, and the first thing to call it always calls it all uppercased, and since the reference count is pretty large, it's very unlikely for this cache to be ever released.

Link to comment

 

On 5/22/2020 at 8:38 PM, Eadoo said:

Another solution would be for me to just remove all of the words that do this from Synonyms.txt.  It will, in general, reduce the quality of the database, but I think it's an acceptable resolution, especially as I turn my eyes to the magic 1.0 release 6-9 months from now.

That will probably actually come out 5 years from now.  :)

 

Of course, if it gets fixed in code, then hooray!  Otherwise, I need to smooth out the language generated by the DB anyways (read: remove words that frequently result in oh so strange phrases), so I might as well prune words for other reasons then, as well.

 

While it's annoying that Skyrim has such quirks, for the sake of sanity I do think it may be best to just remove problematic words from Synonyms.txt, at least for your database completion work.  Luckily, the whole point of Synonyms.txt is to.... give us synonyms!  I could certainly live without "quiver" and have it replaced with "tremble" or "quaver".

 

There may be a few instances where a player has less popular mod installed that causes additional words to be an issue - but if the problem is documented on the OP it shouldn't be difficult for them to resolve this for themselves.  XPMSE/Racemenu ect are so common in adult load orders that it does make sense to work around them if resolving the caps issue is not a trivial exercise.

Link to comment
10 hours ago, Reesewow said:

There may be a few instances where a player has less popular mod installed that causes additional words to be an issue - but if the problem is documented on the OP it shouldn't be difficult for them to resolve this for themselves.  XPMSE/Racemenu ect are so common in adult load orders that it does make sense to work around them if resolving the caps issue is not a trivial exercise.

I don't mind all caps or the first letter being capitalized in the middle of a sentence, but it seems there are those who do. In that case, documenting all the mods that can add a similar string from anything that uses BSFixedString is simply not viable.

I've a bunch of "Titled" words, some fully "CAPITALIZED" words and some "TwiTTeR" words in my game, and trust me, I use a custom edited Synonyms.txt with a lot less words than in both Apropos 2 and its DB update.

 

Moving the whole reading and formatfing to C++ is pretty simple, it just requires the author a good amount of time to restructure all the scripts to use the new method.

One thing I could do was patch the cache to make it all lowercase if there is more than one letter uppercased in it and the data has no whitespaces. A side effect is that you will always see these words lowercased instead of how they were initially cached. It also could be a problem for C++ code that checks them case-sensitively.

Another thing that can be done is patching the cache, reading Synonyms.txt, building an array with all the words in there and always forcing it to cache those words lowercased. Side effects would be the same as the above hack, but now you will also always see some titled words fully lowercased.

Any other hack that I can think of would require editing the scripts, at this point it's better to just do it properly with reads and formats from C++.

Link to comment
4 hours ago, xyzxyz said:

Do these messages base on personal stats or just random or something? They appear under the normal messages during sex. I'm pretty sure I didn't forgot  serana in a falmer cave for a few days.

20200527143313_1.jpg

Hahahahaha...I wrote that one during a period when I was trying to add content to integrate with the lore in Kyne's Blessing.

This isn't a normal sex message - it's a W&T transition message.  Specifically, it's in FemaleActor_WearTear_Reduced_Vaginal.  They're random, so I've tried to make sure content in the DB doesn't presume too much about the player or NPCs.  My *own* presumption was that any follower *could* have been trapped with the Falmer prior to their time with the player.

This one, unfortunately, doesn't make any sense for Serana to say.  We know that she was locked in a crypt for a VERY long time, so...

Maybe it was a part of the sequence to become a Daughter of Coldharbour?  Hahahahah

Link to comment

SKSE plugin to bypass Creation Engine's string cache for Apropos2.

Spoiler

2056773349_enb2020_05_2920_47_24_15.png.f2c224f28fa817fc96fd7e13f4352e96.png

Used this simple script to test it out:

Spoiler

Event OnKeyDown(int keyCode)
    Actor male = Game.GetForm(0x0001A691) as Actor ; Skjor
    int[] maleParams = new int[3]
    maleParams[0] = 0                       ; Gender
    maleParams[1] = Utility.RandomInt(0, 4) ; Arousal
    maleParams[2] = -1                      ; Wear & Tear

    Actor female = Game.GetForm(0x0001A697) as Actor ; Aela
    int[] femaleParams = new int[3]
    femaleParams[0] = 1                       ; Gender
    femaleParams[1] = Utility.RandomInt(0, 4) ; Arousal
    femaleParams[2] = Utility.RandomInt(0, 9) ; Wear & Tear

    int widgetID = 1

    while (widgetID <= 16)
        int result = Apropos2SKSE.SetMessageText(widgetID, "MaleActor_Female\\MaleActor_Female_Anal_Orgasm.txt", 3, female, femaleParams, male, maleParams)

        MiscUtil.PrintConsole("Result: " + result)

        if (!result)
            UI.InvokeString("HUD Menu", "_root.WidgetContainer." + widgetID + ".widget.setFont", "$EverywhereMediumFont")
            UI.InvokeNumber("HUD Menu", "_root.WidgetContainer." + widgetID + ".widget.setTextSize", 20)
            UI.InvokeNumber("HUD Menu", "_root.WidgetContainer." + widgetID + ".widget.setTextColor", 0xFFFFFF)
            UI.InvokeString("HUD Menu", "_root.WidgetContainer." + widgetID + ".widget.setAlign", "left")
            UI.InvokeNumber("HUD Menu", "_root.WidgetContainer." + widgetID + ".widget.setWidgetWidth", 300)
            UI.InvokeBool("HUD Menu", "_root.WidgetContainer." + widgetID + ".widget.setVisible", true)

            return
        endif

        widgetID += 1
    endwhile
EndEvent

 

This is the proper fix by the way, which I've started writing after gooser contacted me privately. Hopefully he will make good use of it.

Link to comment

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
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. For more information, see our Privacy Policy & Terms of Use