Jump to content

WhiteWolf424242

Premium Member
  • Posts

    130
  • Joined

  • Last visited

Everything posted by WhiteWolf424242

  1. Whether it'd be that bad or hard... it depends on what the actual edits are. Sometimes it's trivial to patch, sometimes less so. I don't know how exactly the engine works underneath, but I assume yes, it checks periodically for each added spell whether their effects should be applied yet. I don't know the interval of this internal loop, my in-game experience is that it takes up to a few seconds.
  2. If you open up the entire source of a quest script, you'll see that under the hood a "fragment" is in fact hidden function. Example (excerpt from the quest script of DB06): ;BEGIN FRAGMENT Fragment_10 Function Fragment_10() ;BEGIN AUTOCAST TYPE DB06Script Quest __temp = self as Quest DB06Script kmyQuest = __temp as DB06Script ;END AUTOCAST ;BEGIN CODE ;Sanctuary Setup DBSanc_CiceroMovesIn_Enable.Disable() DBSanc_CiceroMovesIn_Disable.Enable() DBSanc_CiceroMovesOut_Enable.Enable() DBSanc_CiceroMovesOut_Disable.Disable() SetObjectiveCompleted (30) Utility.Wait(5) Stop() ;END CODE EndFunction ;END FRAGMENT If you add a property into the fragment field, it'd put it into the body of this function, which is not exactly the correct place, properties should be toplevel, meaning, outside any function. That's what the properties button does, if you check, it appends properties to the very end of the script, outside the functions. This is the same reason why editing a fragment makes the whole quest incompatible with other mods editing other fragments. Editing a fragment means you're editing the underlying quest script. That's an entire file, and both mods have a version of it, each editing a different part of the file, true, but the entire file conflicts nonetheless. (Unless you merge the edits in a patch.)
  3. Do not put properties manually into the fragment field in the CK. That won't even compile. Use the Properties button instead to add properties. (or edit the entire generated script in the Scripts tab, but I don't recommend that if you're still new to this and are not sure what you are doing). I think we may have misunderstood each other though. If you're asking about how to run the code for setting the protection actors in general, then the easiest way is what Dromundas is telling, and editing the fragment itself directly. In order for a script to access something, it must have it as a property. Add your Actors as properties using the Properties button on the fragment (again, NOT directly in the text, use the button), and then you can do this in the fragment: Actor1.GetActorBase().SetProtected(false) Actor2.GetActorBase().SetProtected(false) Actor3.GetActorBase().SetProtected(false) Actor4.GetActorBase().SetProtected(false) Actor5.GetActorBase().SetProtected(false) The drawback of this approach is that your plugin will now be editing the record of this quest. Meaning, it will be incompatible with any mod that tries to edit this quest in any way. Since what you are doing is not strictly related to the quest itself, rather, you just need a "this quest hit that stage event", what I suggested is arguably a better approach. That way you are not editing the quest, instead, your code runs kinda simultaneously, in parallel with it. Running your code on the actors is the same with it. Add your Actors as properties to the MagicEffect script, and the OnEffectStart event should be the same code example as above. Whichever approach you choose is up to you. Editing the fragment is much easier but is worse regarding compatibility with other mods. Making the magic effect is a but harder but it's compatible with everything.
  4. There is a way. You could make a MagicEffect, that has the CK condition of GetStage [ Your quest ] == the stage. Then create a spell ability that implements this magic effect. Then create a start-game-enabled quest, add a player alias to it (Unique Actor -> Player), and add your spell ability to the spell list of this alias. Then attach your script to the MagicEffect, and you can your run code with in an OnEffectStart event. What happens here is that when the quest you're watching for hits the desired stage, the magic effect condition will suddenly be true, it will get applied, and its OnEffectStart event executes. This is the only way I know to execute code when a quest hits a stage, without editing the vanilla quest fragment itself.
  5. Not exactly. CK conditions group all adjacent OR's into one set of "parentheses". So for example in the conditions window, a AND b OR c OR d AND Is equivalent to: a && (b || c) && d That's the only way how it works with CK conditions, it's hardwired. What you wrote: a ORb ORc ORf ANDg ORf ANDh ORf ANDi ANDj AND will be parsed by the CK as(a || b || c) && f && (g || h) && f && i && jThat's not what you want if I understand correctly. I'm not sure ifa || b || c || d || e || (f && (g || h || (i && j)))can be converted into the CK conditions syntax, it's a bit too complex. You can use the de-Morgan identities and other boolean tricks, I'm not clever enough to figure it out. If you have some boolean calculator, it might help getting it into the desired format.
  6. Ah, so even if the NPC is in an interior somewhere that is its own Location, then just checking for IsInLocation for the hold or town-location will still be true? I've quite missed that, thanks :smile:
  7. Hello, What would be the best way to determine the current location of an NPC? By location here I mean a large area, larger than a CK Location. As in "this NPC is definitely somewhere in Whiterun". Or "definitely somewhere in Solitude + docks". For example, I want to know if an NPC is in any segment of Whiterun. I could check for their Worldpsace to be the Whiterun worldspace, that covers most of the town. But how do I handle interior cells? Interior cells are their own Worldspace, and most of them (like Jorrvaskr, Ysolda's home) are their own location too. Unfortunately these Location's don't really have Whiterun-related Keywords on them either (which could have been something to check on). I'd like to avoid the bloat of having to list a lot of conditions, manually comparing the parent location of the NPC to every Location that's known inside the city. Is there a shortcut around this? Thanks
  8. I'll just drop in a quick comment to say that if you actually pull this off, and it's going to resemble something like Gwent Beta (I see you're planning 3 rows. Please keep that? ), that would be phenomenally awesome :D
  9. That's wicked :laugh: Unfortunately it'll take me a few days before I can get back in front of the CK again to try it out, but this looks perfect. Thanks very much for the help :)
  10. No. In a nutshell, the player interacts with an NPC, any NPC, and this spawns in a book with some text, including the name of the NPC. The player can thus spawn any number of such books, so they cannot possibly be all stored in aliases forever. Since the text of the book should include the name of an NPC, which is dynamic information based on who the player interacted with, it cannot be made by swapping premade books and tricks similar to that, hence my question about actually managing to replace the text of the book dynamically. EDIT: I see. Well... that's going to be an obstacle then, if it's not accessible with default skse. :/
  11. Thanks dylbill, that's a huge step forward :smile: However, this wouldn't allow to "let go of the alias", right? What I mean is that even if I leave "Clears name when removed" unchecked, after making the edit, I can't just remove the book from the alias. In the context where I want to use this, the number of books that would have to be edited (with strings randomly selected in the script) is not defined, because it is up to player actions. So ideally, the editing of the text should be permanent so that the book reference doesn't have to be stored in aliases forever. But here, since the actual underlying text of the book is an alias text replacement, it always has to be inside a uses-stored-text alias if I'm right. So that's not exactly usable for this I'm afraid :sad: Yeah, also the thing that it requires the player to close the book before taking effect is a rather big inconvenience. I don't know... would you say it's realistic to write a standalone extender for this? I mean, I took a few glances at tutorials for skse dll's, and they don't seem like impossible-to-learn black magic. And the text of the book must be stored somewhere as some form of string, so I think there may a chance to be able to edit it... Alternatively, my workaround for my context would be to change the feature so that the player action only edits the name of the book, and the inside text stays generic. That should be possible, since just the name change through the alias should be permanent with the "Clears name when removed" unchecked, and it doesn't have to be stored forever. But the actual text edit would be the great version... :D So if it's not a known impossible task to do, and it's not yet been done anywhere, I might take my shot at it. Worst case scenario is that it doesn't work.
  12. Hello, Is it somehow possible to manipulate the displayed text of Books with a script? I mean something like this (with a made-up SetText function): Book Property aBookFromCK Auto function some_function() aBookFromCK.SetText("This is the new text for the book") endfunction And then after calling the function, when the book is opened in-game, from here on it should show the "This is the new text for the book" string. So far I haven't found any option for this. I've checked SKSE, papyrusUtil and powerofthree's papyrus extender, but none of them seem to have such a function for Books. Is the perhaps some other extender I don't know of, that might support such dynamic text replacement somehow? Thanks
  13. Implemented :) It gets rid of the corpse, marks the spot with a stone, and you get to write your custom engraving for the gravehead. https://www.nexusmods.com/skyrimspecialedition/mods/52990?tab=description
  14. You could start with this implementation: https://www.creationkit.com/index.php?title=Detect_Player_Cell_Change_(Without_Polling) And in the script when the cell is changed, just filter for your desired locations, store that they have already been visited, and run what code you need. PS: If you know that you will only need CK Locations, and will never need to distinguish between cells in a location, you can just use OnLocationChange: https://www.creationkit.com/index.php?title=OnLocationChange_-_Actor Then it's the same, filter for the Locations you need in the event, store that the player visited them, etc.
  15. Hello, I can't seem to figure out how to execute code when a hotkey made in SkyUI is pressed. I have the MCM interface setup, so the key DXScanCode is stored on the MCM script - but how do I know when the player presses it? What kind of event is sent to what? I've been following this guide: https://github.com/schlangster/skyui/wiki/MCM-Option-Types#keymap-option But it only has the OnOptionKeyMapChange event, which is for when the key is changed in the MCM. What is the event for when the set key is pressed in game? Thanks EDIT: Never mind, found it :) https://www.creationkit.com/index.php?title=OnKeyDown_-_Form
  16. You can and should run QuickAutoClean on it to remove ITMs, that's the easiest way to quickly filter out the truly unnecessary edits. As for the rest, they could be wild edits (edits that serve no purpose for the patch), or could be genuine necessary edits. You mentioned removing something (candle smoke) - I can image that if you do that, then the use of the now deleted thing had to be checked out from other forms that were referencing it. These are then necessary edits. To find if any actual wild edits slipped in there can only be found out manually by checking and tracing what each edit does I'm afraid. But if all you did was just remove on thing and reposition another, then I think anything that's not an ITM is a necessary edit. Maybe someone else can offer more specific advice, these were just my general tips.
  17. Yup, "Comments on files, images and videos" is enabled. All right, let's hope it was just that then (if I catch more comments with no notifitactions, I'll let you know :smile: ) EDIT: Yeah, seems to be working correctly now. Sorry for the false alarm.
  18. Hello, There seems to be a notification issue with the site again. I received several new comments on one of my mods, but notifications didn't arrive for them. It was working in the early hours today (8 AM GMT+2, when the last notif arrived for a comment), but definitely stopped working since afternoon. Thanks
  19. My only concern is alias AI packages, which (as far as I'm aware) only stack up but don't "interact or clash". No scripts here this time. The one the top of the stack is applied, question is of course but which gets on top in this case of equal probability quests. Timelike order of being applied also makes sense :smile: Didn't think of that but yeah, it's also a reasonable assumption. Yeah, it would be cool if someone knew this for sure, otherwise yeah I'm afraid I'll have to cook up a small testmod to find out. EDIT: Also, what I meant about manipulation is not about editing the quests, for a bit more context:
  20. Hello, Let's say two quests are both at max priority, and both try to place the same NPC into an alias, adding a package to it's AI stack. How is it determined which is loaded higher? Is it random, or does it depend on something that can be manipulated? Maybe it's in alphabetic order of quest ID then? The CK wiki doesn't seem to say anything about this, does someone perhaps know? Thanks
  21. You don't have to click "Save" to just make changes to the text. If you just want to edit text - then just edit the text and click OK. It will be saved. If you want to edit the audio, then you need to hit record, and then if you're pleased with the result after a preview, you can hit Save to save the audio. That's all the "save" button does.
  22. I am absolutely not a mesh expert, so maybe someone else will give better info, but I'd first try to update the tangent space with nifskope. Go to the NiTriShapeData blocks, and in BS Vector Flags, make sure it has the Has_Tangents flag enabled. If it didn't, then enable it now, and after that right click the model, and under 'Mesh', select 'Update Tangent Space'. Maybe this will solve it.
  23. Hello, There is this thread: https://forums.nexusmods.com/index.php?/topic/3678745-alternate-start-live-another-life-crash-after-trying-to-activate-the-shrine-of-mara/ Where they detail that it's possible to make the Mara shrine activator added by Alternate Start, and also other daedric shrines and such, to crash the game when activated, if a mod "filters dialogue incorrectly". And now it's been brought to my attention that one of my mods does exactly that, and I can confirm the CTD, yikes. I backtraced the problem to a single Quest in the mod. Apparently if this Quest contains ANY branches, it will make the statue CTD. It doesn't even have to contain any dialogue at all. It just has to contain a branch. My method of finding this out: It had several branches, I removed all but one, also removed topics but one, leaving with just 1 reply Test: CTD. Then removed this reply too so that the quest still has a branch, but loads no actual dialogue: CTD! Then I removed the branch, so that the Quest is just there doing noting: NO CTD. Tested again by leaving another branch there, but still empty with no dialogue: CTD again. I even tried this: remove everything from the quest, then add a completely new empty branch. Take it for a test: CTD! Thus I conclude, if the Quest contains a branch, it will CTD. It's not about the dialogue, it's not about the branch, it's something about the Quest. (If the Quest loads the branch, but the Quest itself is not running ingame, no CTD though, but that makes sense.) I do not understand how this is possible. It's... a Quest. A regular Quest like any other. What makes it special? Its info: - Start game enabled: true - Run once: false - Allow repeated stages: false Contains just one stage, 0 with no fragmens. Quest attaches 3 scripts. Contains Player dialogue, and nothing else. I have other quests in the mod with dialogue (and I have other mods with dialogue...) with similar conditions, all working great and not causing issues with the Mara statue. But apparently it's not even about conditions, because it will still CTD if this one quest even just contains an empty branch. I'm dumbstruck. I checked in xEdit if something is perhaps off about the Quest... and nothing. It looks normal, regular values what you'd expect for a quest. Does someone perhaps know what the solution for the other mods mentioned in the linked topic was? Or what dark wizardry am I overlooking here? Or if it's a weird CK or engine bug and there's not much to be done about it...? Thanks EDIT: In the meantime, I did it the arduous way, and created a new quest and moved all my dialogue over to the new quest. It now works, there is no CTD. CK bugs are awesome. If a poor soul has a similar issue in the future and finds this topic - tough luck, you'll probably have to move all your dialogue to a new quest, as the existing one that's giving the CTD is probably cursed.
  24. I seem to recall Scriptname being the rare exception in Windows that is still case sensitive. So try with correct capital lettering. Your fragment script should read: Form BP = (GetOwningQuest() as _DOM_DominiqueController).BrowniePoint ObjectReference DGC = (GetOwningQuest() as _DOM_DominiqueController).DomGiftChest ... Also note that the type of BrowniePoint is MiscObject on your quest script but Form on your fragment. This is not necessarily a problem, but it is if you want to use functions that are specific to MiscObjects and not available to just a Form. I suggest to keep it consistent and use MiscObject = (GetOwningQuest() as _DOM_DominiqueController).BrowniePoint instead.
  25. For a new NPC, that should be under its quest's Misc -> Goodbye topic. https://www.creationkit.com/index.php?title=Misc_Tab For existing voicetypes... it's probably in one of the vanilla dialogue quests, I don't know from memory which one. Maybe search for 'dialogue' in quests and check those one by one (same tab: Misc -> Goodbye).
×
×
  • Create New...