Jump to content

WhiteWolf424242

Premium Member
  • Posts

    130
  • Joined

  • Last visited

Nexus Mods Profile

About WhiteWolf424242

Profile Fields

  • Country
    None

Recent Profile Visitors

22014 profile views

WhiteWolf424242's Achievements

Collaborator

Collaborator (7/14)

0

Reputation

  1. In case you didn't yet find the solution, it sounds like you don't have the mod limit fix. https://www.nexusmods.com/witcher3/mods/3643
  2. Fortunately, as far as I'm aware, my works are not involved with those, so I don't know if they could have this same problem. Possibly. Info for anyone reading this: Cartogriffi was able to kindly help and the port is already down, so revoking an xbox permission is doable. :smile:
  3. Hello, Sorry if this is the wrong topic to post about this. About a year ago, I foolishly allowed someone to make an xbox port of one of my mods. I do not have an xbox, therefore I had no means to ascertain that the port works, I simply took their word for it. They released it on the bethesda website. Ever since that day I keep getting PMs on all platforms imaginable about how and what doesn't work on xbox. I have no way of finding out what causes these issues - at this point, I'll just assume that the port is simply dysfunctional. The PC version of my mod has long evolved way beyond that old version that was ported anyway. However, the person who made that port has been unavailable starting from the day they published their work, haven't replied to my emails. And despite all my FAQs, all my sticky infos, people keep finding me with that port and I have had enough of being continuously blamed for and accused of something that I had no responsibility for. My question is, is there any way for me to get the port deleted for good? Can I somehow "revoke my permission" for the port to be in a published state, and then can I report the mod on the beth site to get it down? How does this work, who should I contact about this? Should I open a ticket at the bethesda support? Thanks for your ideas (and sorry for my negative tone)
  4. Running a dialogue condition on an alias only allows you to select aliases from the owning quest of the dialogue topic. See here: https://www.creationkit.com/index.php?title=Conditions If you want to avoid having to set up your own alias for your duplicate quest, you can apply a dialogue for the player's current follower by running instead on Subject, and having the GetPlayerTeammate == 1 condition.
  5. This is just an absolute wild "maybe who knows" kind of guess, but since it crashes specifically when opening the response window and you're making silent dialogue, maybe it's something with the sound driver input? You see, if for example I don't have a microphone connected at the time of opening the response window, the CK will prompt me with an error that it can't find a device for recording. My guess is that this is the step where it gives a more severe problem for you for some reason (namely a crash). So unless someone knows an actual fix, and unless you've already tried this, maybe you could try to run the CK with a mic plugged in, see if that helps. Just an idea.
  6. If you can settle with the compromise of just a monologue, it could be a scene that plays in the player's head (the way the Night Mother speaks for example). That can work from any location in the game. If it has to be a dialogue... maybe try a forcegreet with an extremely large trigger radius? I don't know if that works, just an idea.
  7. All right, thanks :) I guess only one way to know for sure - next week I'll try a stress test, I'll spawn 128 objects, and try loading a saved game with them in the inventory and check the papyrus logs after. If it causes a stack dump, I'll revive the thread.
  8. Thanks very much :smile: I'm afraid I do things a bit differently. My mod doesn't contain any OnItemAdded and OnItemRemoved events by the way, so there's nothing I can do about those - I'm just worried what I might trigger by doing by stuff if someone does have such events without filters in their game. Doing the moving with a limit (why 31 though? Just curious. I get it it's a prime, but any other reason?) seems like a reasonable idea. However, the doing something to the objects is done by the script that's also doing the move in/out. Let me clarify: Each ObjectReference has a script attached, that has this property: ObjectReference Property OwningContainer Auto The script uses states and OnContainerChanged events to store what container the reference is currently in (NONE if dropped in the world). The move in/out of owning container happens as a part of saved game reload maintenance. Alias renamings of these objects are lost on a save reload because their underlying Message title that was renamed with SKSE's SetName() is lost. Which means the items all return to the Message's original CK name - and thus the items in inventories get stacked since they get the same name (and are also the same base objects). Unfortunately, doing just the renaming-back maintenance does not unstack the items. (Instead the last item's name is shown as the stack name). They need to be moved out of inventory, and back in so that they are again shown as separate items and not as a stack. So the maintenance script does something like this: ; objects that need maintenance are sitting in an array like this: ObjectReference[] SentRefs int sentRefsLen ; their current number, guaranteed to be less than 128 function RenamingPartOfTheMaintenance() ObjectReference OwningContainers = new ObjectReference[128] int i = 0 while(i < sentRefslen) ) ; iterate over all currently in-game items ItemScriptName itemscript = SentRefs[i] as ItemScriptName OwningContainers[i] = itemscript.OwningContainer ; get owning container from their script ; if this is not NONE, the item is in some inventory, and needs to be moved out then back in to avoid stacking there if(OwningContainers[i]) SentRefs[i].Moveto( someXMarkerInAJunkyardWorldspace) endif ; clear renaming alias here ; update underlying Message name here i += 1 endwhile i = 0 while(i < sentRefsLen) ; force ref back into renamer alias to update name here if(OwningContainers[i]) ; it was moved out previously, now to put it back in (silently) OwningContainers[i].AddItem( SentRefs[i], 1, true) endif endwhile endfunction (A note: I'm not renaming my items with SetDisplayItem() because they are books and that breaks their text replacement. See this thread and this thread. I'm afraid this is the only way to reliably rename successively spawned book references with text replacement.) Most of the ObjectReferences are likely in the player inventory. So would it help if the loops only went until something like 31, and then went to sleep for a few seconds by registering for a single update, to allow other stalled papyrus stacks to get out of there, and then continuing there?
  9. Hello, Unfortunately it seems a project of mine is going downhill into the situation, where it will have to do that: Move lots of unique ObjectReferences out of, then into the player inventory in a quick succession. As far as I know, this is a golden recipe for triggering possible papyrus stack dumps if there are lots of other scripts present in the game without the necessary inventory filters. So the scenario is that the ObjectReferences are sitting in an array on a script, and they have to be moved out of the inventory, (the script the does some stuff to them, namely puts them into aliases), and then they must be moved back into the player inventory, silently. The theoretical limit of the objects is 128 (length limit of the array). I don't expect to have this many ObjectReferences in an actual game, but theoretically it's possible that the script will have to move up to 128 ObjectReferences out of, then into the player inventory. Successively, quickly. How is it possible to do this safely? Are there some sort of precaution techniques that can do this in a safe way, preventing a possible stack dump? (I mean on THIS end of the code, that's doing the moving in and out thing. NOT on the end of the other scripts that failed to use inventory filtering to reduce their load.) Thanks
  10. No... that's the problem, I don't have a controller. I can't test anything related to it, I can only guess, and ask other people to test. A friend with a controller with a modded controlmap.txt has found this: The feature itself doesn't work, so Input.TapKey(1) does nothing. Apparently, GetMappedKey("Pause") returns -1 with a controller, so it's completely unmapped towards the Input script. (Returns 1 correctly for keyboard for me). We also tried to "scan" the keycode of the B button, see what a script sees when it's pressed. This was done with GetNthKeyPressed in a scanning wait-for-input while loop: int keycode = -1 while(keycode == -1) keycode = Input.GetNthKeyPressed(0) ; with some added counter to stop the loop after a good while if nothing is happening, so if keycode is staying -1 and not detecting what is being pressed endwhile if(keycode != -1) Debug.Notification("Detected pressed key: "+keycode) else Debug.Notification("No input detected, key is unmapped, keycode stayed at -1") endif Keycode stays -1 for B, and also for A (another test). He didn't test the start button. I carried out the same scanning test, and all keys returned the correct keycode that's shown for them on the wiki, so the test itself works on keyboard. (I tried Esc, tab, i, w,a,s,d, etc.). That leads me to assume that the Input script simply cannot handle a controller. So I kinda gave up. I instead found what I added in the edit of the OP: another way to close down menus, that doesn't rely on the Input script. A downside is that this also exits the player from the inventory view (whereas in my context I just want to close down a book menu, but not the entire inventory menu). It would be cool to find a way to bring the inventory menu back up automatically after this forces it to close. Input.TapKey(<code for i>).... forget it, it won't work :D (that's why I also asked to check if the A button works - it doesn't.) Actor.OpenInventory(bool forced) is apparently not made for this, that's some sort of pickpocketing menu opener. Trying Player.OpenInventory(true) opens a weird pickpocket from self to self menu. (and opens nothing if the forced parameter is false.) I don't know any other way to open the player inventory via script. So for now, for my context, I perform the check with Game.UsingGamePad(), if false, then I retain the old (and best) way of using Input.TapKey(1), and if true, then it'll use the other way in the edit of the OP, and gamepad users will thus have to live with the compromise that if they wanted to stay in inventory view, they have to open it back manually.
  11. Hello, I'm making a feature (namely this), that requires the Input.TapKey(1) ; fake Esc press code to close down a UI from a script. While this seems to work fine for keyboard+mouse (at least, it works for me), so far nobody I've talked to, who uses a controller/gamepad/, was able to get it working. When the UI is supposed be closed by this, nothing happens. I'm assuming that the problem lies in the different dxscancodes of the controlmap.txt for keyboard vs gamepad. On the wiki it says: Supported GamePad buttons: 0x10A 266 DPAD_UP 0x10B 267 DPAD_DOWN 0x10C 268 DPAD_LEFT 0x10D 269 DPAD_RIGHT 0x10E 270 START 0x10F 271 BACK 0x110 272 LEFT_THUMB 0x111 273 RIGHT_THUMB 0x112 274 LEFT_SHOULDER 0x113 275 RIGHT_SHOULDER 0x114 276 A 0x115 277 B 0x116 278 X 0x117 279 Y 0x118 280 LT 0x119 281 RT One of the controller users said that the equivalent of Esc would be the B button. So I tried to modify my script like this: if(Game.UsingGamePad()) Input.TapKey(277) else Input.TapKey(1) endif I'm afraid that did nothing, still nothing happens for controller users. I did some printouts: - Game.UsingGamePad() seems to work correctly - I also tried to print out Input.GetMappedKey("Pause"), which returned: - '1' for keyboard, as expected - '-1' aka 'unmapped' for 1 person using a controller So I'm guessing that this is where the problem lies, for controllers these dx keycodes are just... somehow different. Does someone know what's going on? What key code should be pressed in case of a controller to achieve the effect of pressing Esc on a keyboard? EDIT: Figured this: Game.DisablePlayerControls(abMovement = false, abFighting = false, abCamSwitch = false, abLooking = false, abSneaking = false, abMenu = true, abActivate = false, abJournalTabs = false) Utility.Wait(0.1) Game.EnablePlayerControls(abMovement = false, abFighting = false, abCamSwitch = false, abLooking = false, abSneaking = false, abMenu = true, abActivate = false, abJournalTabs = false) This seems to work as well, at least in the case of a keyboard. It's independent of the input script, so I think this will also work for gamepads.
  12. Thanks, but I fail to see how that's still not just making an alias for each Book. I'd still have make 128 messages and 128 aliases, only difference is that they'd be in groups of 5 on 26 quests. The method of duplicating quests may speed up the process of creating them, but I don't see what other advantages this would have over just putting 128 alias on 1 quest. I'd also still have to manually set each alias to its respective message. If possible I'd like to make it work by reusing the same aliases and messages, like during the spawning. If no such workaround is possible, then yeah, I guess this is what we have.
  13. Hello, Long post incoming, sorry for that, but unfortunately every detail matters. The aim: Every now and again, on a periodic update, Books which contain text replacement are spawned in (max 5 at a time, and later sent to the player). The aim is to rename the title of these books from the script that spawns them and then for them to keep this name throughout the game. The number of books spawned is indefinite, as it depends on player input. The method: Because the books contain text replacement, SetDisplayName() will not work on them correctly according to this thread, and I too can confirm that text replacment gets broken if SetDisplayName is used on it. Therefore the only alternative I know for renaming is using aliases and message titles. Because the overall number of Books is definite, it's not really possible(*) to create an alias for each and store them permanently. They must be cleared and be re-used for the next cycles. So we have a Message, and a TitleSetterAlias on a quest, and the Message is set as the display name for this alias. Clears name when removed is unchecked. The renaming after the spawning then happens like this: MessageProperty.SetName("title for the next book") TitleSetterAlias.ForceRefTo( bookReference) Utility.WaitMenuMode(0.2) TitleSetterAlias.Clear() The problem(*) with this: because the Books share the underlying MessageProperty as their names, when several are spawned in together, they each get the title of the last one renamed. Elaborating on this: This problem was possible to overcome by having 5 aliases and 5 messages (since the max number of books spawned at the same time is 5), and each gets its own alias. Surprisingly enough, when the next cycle comes, and the next bulk of books get spawned in and renamed, the books from the first cycle keep their name. Even though now book 1 from cycle 1 shares the Message with book 1 from cycle 2, their displayed name in the game is different and correct. Now to be clear, I'm not exactly sure why this works. The minimum interval for these cycles is 24 in-game hours. The Problem: The unsolved problem lies with saved game reloads. SetName() for the Message is not kept between saved games, that's a fact, so each Message returns to their starting CK name on a save reload, and thus each book also resets to this default CK name (of their respective underlying Message). Triggering an update on names is not a problem, they are stored as strings, also the objectreferences of the books are available for the event when a saved game is loaded. No issue with that. The problem lies with the Book names getting mixed up all over the place because of their shared messages, similar to what I described at (*). Because if I refresh the name of Message1 to titleA, all books that share this as their name will display title1. For example, let's say we have: Book number 1 with underlying MessageA and supposed titleA from cycle 1 Book number 1 with underlying MessageA and supposed titleB from cycle 2 Book number 1 with underlying MessageA and supposed titleC from cycle 3 If I rename MessageA to titleA for the first book, since it is used by all first books from all cycles, all three of them get renamed to this, which is incorrect, since they each have their own titles. The same is true for book number 2, 3, 4, and 5. I tried several things, like waiting time between renamings, forcing the books in and out of aliases to get them to forget "their past association" with their Message, and get new ones, similarly how the spawning works. But for now, no matter how I tried to shuffle the aliases, I couldn't get it to work consistently. It's important that here it's not possible to wait 24 in-game hours between alias shuffling and message renaming, like in the case of the cycles at (*). That was possible for the spawning of the books, but this is a saved game reload, and this is about maintaining the existing books, which should be performed as quickly as possible. To experiment, I tried waiting as long as up to half a minute real time though. It did not work, renaming the message still affected the other books it shared. So at the moment the only solution I see is to indeed have as many aliases and messages as there are books. (*) It's not true that this is not possible, but it's immensely inconvenient. Because their number is indefinite, the number of aliases and messages would have to be 128, the hard limit for the arrays which the scripts use. (and also thus the theoretical hard limit for books). But then each book would have its own message and alias, leaving no room for confusion. However, I don't want to flood my mod with 128 aliases on a quest and 128 messages, unless absolutely necessary. If someone has any idea about how to fix the saved game updates, that'd be a huge welcome! And thanks for reading the post :smile:
  14. Hmm, that's the actual implementation of Java's hashCode() for the String class? I googled it and multiple sources say yes. Weird, I always thought it would be a lot more complicated. Seems great to use, thanks. :smile: Hence the parentheses with "as far as I know". I stand corrected, that's good to know :smile:
×
×
  • Create New...