Search the Community
Showing results for tags 'modding help'.
-
Hello everyone, good evening/morning, whenever you find this post. The reason for it is simple. When I play Skyrim, I tend to use dwemer storage cube. It's a simple, not big nor small player home. Perfect for a scholar type with almost all I need. But I always end up using Jaxson positioner to put things that I end up needing on the long run or moving storage to make it more ordely or confortable. For example, -I use morrowloot ultimate, so I tend to get a copy of the skyforge into it since that mod adds the mechanic that only the skyforge can make dragon, ebony and daedric equipment. -I get a copy of an oven to make pastries since I use cum,alchemy. -I tend to make the Peryite quest, because only in those dwemer ruins, theres a fountain type structure that can copied to be used to bathe and fill bottles of water, since I use EatingSleepingDrinking mod. -I also roleplay with my female character being a "Miltbrew", a cum alchemist, I tend to leave the center of the cube espacious to summon creatures to "milk" them. It's always the same list and true be told, it feels good building it, like a Fallout 4 building mechanic. But its very slow. And I have to do it everytime I star a new character. THAT'S WHERE MY REQUEST COMES. Does anyone could please provide me with a link to a tutorial for the GECK so I can make this changes to the cube without having to go one by one through the game. Most I've found are very old, 2012-13 and I dont feel confortable trying old tutorials with how much has changed. For reference, this is how the cube looks when I am halfway. I am still missing the Oven and the fountain to bathe since I have not done the Peryite quest yet. For reference, It usualy goes on that corner on the top of the image next to the bookcase. I usually move that bookcase through the walls of the fountain and its left as a small shelve to put things. Yes it looses the ability to hold books but I usualy just fill it with soulgems, potions and tusk. Any help is greatly apreciated. Also, if I put this in a incorrect forum please inform me so I can delet it or move it. Sorry for any misspell. English is not my native lenguage. Thank you.
-
View File [XCL] X-Change Life Mod Loader Utility This is the official utility that can be used for applying mods to the game X-Change Life. Find mod loader usage details here: https://gitgud.io/xchange-life/mod-loader/-/wikis/home And a step-by-step guide for applying mods with this utility: https://x-change.life/wiki/docs/mods/ Developed by @togashikokujin who is a primary contributor to the X-Change Life project. If you feel like buying me a coffee, https://ko-fi.com/togashikokujin. The mod loader will always stay free, though. Starting with version 2.4.0, we had to up the Java version from 8 to 17. If you get the oh-so-helpful "A Java exception has occurred" when running the jar version, you will need to install a newer JRE. https://www.oracle.com/java/technologies/downloads/ is a good place for that if you don't already know what you're doing and have other preferences. NOTE: If you're using the installable version of the mod loader, be sure to install it to a folder other than your XCL folder. It will delete everything in its folder when you install updates. We do not have control over this aspect of the installer. Submitter togashikokujin Submitted 01/30/23 Category Gameplay Utilities
-
I'm trying to redo Futanari FEV, I've already done all the basic functionality for the MCM menu that suits me, but I have two fundamental problems.: 1. Changing the gender by adding a keyword is triggered only by saving and reloading the save 2. if you do not change the gender and just leave the strap-on in the form of a penis, then they overlap each other, and even if they occupy one slot, then the penis will also not appear. To solve one of these problems, I was thinking of writing an F4SE plugin that could fix it, but all my attempts were unsuccessful, the problem is the same, I do not know for what reason the cache in AAF does not restart. When solving the second problem, which would seem to be a long time ago, just take off the strap-on if I'm a futanari, but the thing is that XML is not ready to accept the conditions and is quite primitive. In this regard, I am trying to appeal to caring people for information and possible solutions to this problem, the ideal option would be to solve both problems, in the end, the choice of two options would be decided by a tick in the MCM menu.
-
Ok ok so now that the click bait title is out of the way let me be clear im a lazy bastard truly am loot though good everyone in the adult modding scene knows its... only really good for vanilla andys sure it helps but isnt a solution. so as a hobby i like to fuck with AI see how they handle more... boring but interesting tasks like i said im lazy and thought fuck it lets see how AI handle load orders now most were garbage failed freaked out mad incomplete lists ect however Claude.ai holy shit call me impressed without any real direction outside of here have some .txt docs from Mo2 make them work for skyrim ae ect ect its not a massive list but aint small its 500+mods with 350ish plugins all complex mods with scripts and masters and insula load orders all that jazz now the first run was meh decent around loot level but then bam i said try again here use this as a guide and online research credit by the way this guide kicks ass i gave claude.ai this pdf was like hey use this as a base yadda yadda set it to extended thinking gave it the files for MO2 plugins.txt , loadorder.txt , modlist.txt now for those who dont know plugins is well plugins the little box on the right of MO2 loadorder is the well the loadorder of that list modlist it the window on the Left of Mo2 and both are actually important to sort in different ways guess what Claude.ai did took like 10 mins but got a perfect working order well near perfect fuck it made loot seem laughable i love loot i really do but it only works if every mod Author works with them or use the other methods and lets be honest some of us wanna play the game rather then just spend our time on nexus, here or other sites and spend 2 hours fine tuning a load order to mess it up adding a new mod but yeah look dont use chat gpt, grok, gemini, or those other clowns find a good modding guide that also covers load order preferably one like Lunas and feed its pdf straight down claudes throat cause it can take it like a champ and be able to actual do your load order while you fuck off and go do other shit come back copy then paste it run loot for errors (dont actually apply the changes) if it shows up good your set if not tell claude to try harder and go eat a sandwich or some shit also though this is an adult site (mostly) i am aussie so yes i did say bad words lol
- 16 replies
-
- modding
- modding help
-
(and 2 more)
Tagged with:
-
I'm new to modding and have been trying to make a Xenos mod. I'm starting off with the portrait part, using vanilla framework as a reference, and building off of the Xenomorph expansion mod(But just focusing on the portrait part) Could anyone help walk me through this, because I'm still very confused? Been using ChatGPT to help me out with this. I've also been using Visual Studio Code. Xenomorph_focused_Mod.7z
-
Things in the Dark could have been one of the greatest LL quest mods ever. Unfortunately, it has a lot of bugs. The "modified" version fixes some of them, making it sort of playable. Almost every quest in TitD is a broken progression blocker. Why does TitD have so many bugs? Why does Delzaron consistently make mods that have so many faulty quests? To be fair to Delzaron, he's not the only modder with this problem, he's just the most prolific. I could name a few other authors, with buggy mods, who script their quests in exactly the same way. When trying to patch up my TitD so I could play through it some more, I started to see various common recurring problems, with how the quests were set up. I think TitD serves as a "how not to" guide on writing quests, and there are some cautionary lessons to be learned from it. Most broken quests involved a simple mistake or typo, or some non-updated value, but those mistakes all have a common root cause: unnecessary complexity. The quests are not cookies, they are snowflakes, and this massively expands the effort required to write and test them, to the point where it is impossible. Because it was effectively impossible, Delzaron failed. How can we ensure that quest development remains in the realm of possible, or better still easy? Rather than hard, or impossible? As mentioned above, the complexity and hardness comes from a few oft-repeated mistakes. As these common mistakes are so well established, and known to be flaws in so many mods, you'd think that we'd stop seeing them. Skyrim quests aren't written in a world of automated testing and extensive QA, and they can not easily be continuously updated without upsetting players with running games. Mods get periodic releases, and those releases should be as robust as possible to avoid player angst; quest logic should be as defensive as possible. If it allows the player to cheat, it's better than a quest that easily becomes blocked. When you do multiple bad things, you compound the player's pain. When you do multiple good things, you reduce the risk of your mod breaking, even if you make a mistake somewhere else. The following practices combine together to help stop the root cause of numerous quest bugs that have a common form. 1) Quest stages should be self contained What I mean by this, is if you do "setstage" on a quest, the quest should be set completely in the correct state. It shouldn't be possible to run setstage and have the quest go into an inconsistent or broken state. For example, some player dialog becomes available at stage 50, if you have collected 10 mushrooms. Choosing that dialog runs a fragment that sets another NPC's faction, sets that NPC's location, and puts a key in their inventory. Then it sets quest stage to 60. What's wrong with this? The problem is that if you want to test this quest, you cannot simply set the stage to 60, because the NPC won't be set up properly. If this quest breaks, you cannot simply set the stage to 60, because, again, the NPC won't be set up properly. How it should have worked is quite simple: the dialog fragment should have done ONE thing, set the quest stage to 60. Then, the trigger script for stage 60 should have set up the NPC's faction, location and inventory. In this case, you can test stage 60 of the quest without any additional preparation, the stage is "self contained". Following this rule avoids so many problems. The bad pattern occurs when the logic to set up the quest stage is hidden away somewhere in a different stage. This is not good modularity or encapsulation. Quest stages are a developer tool to help organize work, but many modders use them with no clear objective in mind, just because they think they should 2) Quest stages should serve a clear purpose If you have quest stages that exist without objectives, alarm bells should probably go off. Why does that stage exist? What state is it representing? In most cases, a quest stage should have a matching quest objective that the player can see, and the stage advances when that objective is met. Such quests are easy to understand as a player, or developer, and are easy to test. The worst example of this is ping-pong quests that bounce quest stage updates between multiple quests, where none of the stages were strictly necessary, and served only to update a stage on a foreign quest that itself serves no purpose at all but to update back to the previous quest. Multiple quests become entangled for no reason. However, there are legitimate reasons to have a stage with no objectives, particularly if the goal is to sequence events in a simple way. A classic example of event sequencing is the multi-step dialog. The modder uses quest stages (without objectives) to make the player have a conversation with an NPC in a certain order. Each time the player addresses the correct topic, and gets down to the right branch, the quest steps forward, unlocking the next topic and disabling the old one. This is a reasonable way to turn the dialogs on and off, because it's easy to set the quest stage to test the dialogs, and the fragments that advance the dialog stages are simple owning-quest setstage calls. Additionally, testing a quest stage in a condition is quite efficient. This pattern is broken when the modder does strange, random things: The progression of stages is erratically numbered, or jumps back and forth between dialog on different quests in a way that makes following it in the CK extremely tiresome. The stages actually go down as well as up. Very confusing. The stages intermix variant ways to control the quest, sometimes stage number, sometimes a variable. 3) Dialog conditions that involve == on anything but a quest stage are fragile The rider to this is: counter values can advance unpredictably. The corollary of this is that dialog conditions that use == on a quest stage are a good thing, but on counters that go up, probably bad, and on values that take on non-integral values, disastrous. How many mods have you played where you collected one flower too many and the quest become impossible to finish? Jobs of Skyrim, I'm looking at you! Things in the Dark has the same problem. Press the button that advances your slave ranking, and you'll skip past ranking 8, never hit the magic slave-ranking value in the dialog conditions and never be able to transition from Daithe to Hashep. Worse, you can't just setstage to start the Hashep quest-line because this quest violates rule (1) above. The solution to most of these counter bugs is to test >= instead of ==, then if something unexpected happens, your quest can still progress. And by always using a dialog condition with a stage check that asserts the correct stage, the game won't end up polluted with dialogs that should have gone away because they'd done their job. Counter values are particularly unreliable in Skyrim, due to threading, and slow Papyrus, and the player's ability to mess things around, you are asking for trouble when you expect counters to take on exact values. You never know whether you will see every counter value that is set, sometimes you might miss several. If you test for 20 petals, the odds of the player being able to get 22 before your check runs are decent. Just because you never see that case in testing doesn't mean it can't happen. But if the player has to go through a certain dialog to advance the quest, and that dialog only shows up for the exact stage that needs it, that's a good thing, stick to that pattern. 4) Use a coherent numbering scheme and keep stages ordered When quest stages are numbered 0, 10, 20, 50, 53, 54, 55, 67, 90, 100, and three of those stages are not even used, it's harder to work on that quest and keep it aligned with other quests and dialog conditions than if it used sensible numbering. It's even worse if a quest's stage numbers differ wildly from its objective numbers. In the cleanest case, objectives and stages have the same numbering, so you don't have to flip back and forth between stages and objectives to figure out what is being done. There is no reason not to start with quest stages rising in 100s. This allows you to use a pattern of steps of 5 for cases where you are doing simple dialog sequencing. Then, when you see a value other than a round hundred, you immediately know it's dialog sequencing. Of course, sometimes you need to add a stage to an established quest, but this really should be a last resort. Using steps of 100 makes this a lot less likely to run into a blockage though. In such cases, you should still strive to always keep objective numbers lined up with quest stages - there's no reason not to do that and not doing it can be enormously confusing. 5) NPCs can move - cope with it Things in the Dark, and Deadly Pleasures are frequently upset by an NPC being in the wrong place. NPCs walk off and start doing odd things, but the quest demands them to be in a certain room or near a certain marker. In some cases, TitD ports Frabbi out of the city, totally blocking your progression - it's not really what I'm talking about here though - the most obvious issue is NPCs that you have a talk objective with, who will not talk. That said, all kinds of misplaced NPC issue should be considered. Assumptions that NPCs will be where you expect are highly likely to be wrong - unless you have immediate (short term) measures to get them in place. If the PC needs to talk to a certain NPC, don't constrain that conversation to only taking place in a specific location. Constrain it by quest stage. That is enough. It will be easier to test, and work better for the player. Unless you have a really good reason, and proper mechanics around it, stopping the player from having a conversation just because they're in the wrong room is infuriating, and leads to player confusion again and again. They have no idea why they can't progress the quest, and why the dialog is missing. They have a quest objective to talk to NPC X, but NPC X has nothing to say! Avoid that pattern. It's a cause of woe. When dealing with mods like AI Overhaul, NPCs will walk off to all kinds of odd places. If an NPC must stay put, you need a special "priority 100" quest and AI package to lock them in place. Even that may not be enough. You may need a way for the PC to summon the NPC "in game". For example, if your quest requires Frabbi to be in the ruined dwemer pumping station, then port her there at the stage start. But if the player enters the station, check to see if Frabbi is there. If she is not there, port Frabbi outside the (only) exit of the pumping station, so when the frustrated player leaves, he bumps right into Frabbi and can have the conversation. Another thing that follows from this is quest markers - if the goal is an NPC, make sure the NPC is the target, not the location that they may not be at. In DP you can arrive at the quest location, but nine times out of ten, the NPC isn't there. As you don't know who you have to speak to, there's no easy workaround. 6) Scenes are your friend - don't make them an enemy Slaverun has a mechanism for using scenes that allowed Kenjoka to write massive amounts of story content without much in the way of bugs. In comparison, TitD has a small amount of story, and it fails to advance it correctly at almost every single step. Why did Kenjoka have no problems with this issue in Slaverun Reloaded, but Delzaron hits an iceberg on almost every single quest in Things in the Dark? It's not because one of them is simply a genius who keeps it all straight in his head, it's because Slaverun has a high-level system for triggering scenes, and that system is used over and over again to run the story content. This allows the story content to be tested simply by triggering those scenes at the high level. In contrast, every story segment in TitD and DP is a hand-crafted snowflake, built out of quest stages, gated dialog, forcegreets, and AI behaviors. Anything that uses Skyrim AI is inherently fragile. It's mostly fine when you have it working right, but only mostly, and it's hard to get right in the first place. AI sometimes fails for no obvious reason, and the CK mechanism for editing it is extremely fragile. Edit working AI, change nothing, and it suddenly stops and will never run again. At all. As for sharing AI ... it's hazardous. Scenes require no AI behaviors. All you have to do is ensure the participants are present, then start the scene. If the scene has the PC in it, you probably have to move the camera to a dummy and lock their controls while it's running. If you have a scene management system you only need to write that code once. Where scenes go wrong (and alas, Devious Followers is the archetype for this) is when they bind scripting into the scene stages, ad-hoc, possibly even advancing various quests as they go. This is terribly hard to maintain, because you have to know exactly which scene steps have script buried inside them. There are so many places you can hide a script away in a scene. For example, on the dialog lines instead of on the stage that fires them. There is too much freedom, and if you abuse it, you'll never untangle the mess that results. If you're going to run a script on a scene, stick to one script, run at the finish. At most two (one at the start, and one at the finish). You should need very special reasons to run scripting mid scene, and if you do, it shouldn't advance quests or make changes to internal state that advance quests, it should be purely to help the NPCs "act" during the scene. 7) SexLab can fail Don't assume that a SexLab scene will start and run to completion just because you try to start it. If your quest progression is controlled by an animation end handler for SexLab, one missing animation blocks your quest. This is a very simple mistake, and it's simple to fix. Never advance quests (directly) based on a SexLab animation end. If you want to run a pre-defined SexLab scene - create a high-level manager to ensure that shared logic for SexLab scenes is written once and tested many times, not different and unique for each use case. Design the high-level manager so it ensures all participants are present before trying to start the scene, starts the expected scene, and returns, or raises a mod event on animation end. If you know the animation failed to start, handle that immediately in the manager (spit out a Debug.Notify and act as if it ran). In the event of no animation end, use a timeout to catch it. No matter what goes wrong, when the manager determines the scene ended cleanly, or didn't start, or crashed, the caller can safely advance the quest. If there's a debug notification that the player can see in the event the scene doesn't run properly, all the better. If the manager crashes and takes down the control flow, you're still hosed. You can defend against this, but it adds complexity. A high-level scene manager that ensures participant presence solves a lot of problems. I'd rather have an NPC appear from nowhere for a scene, than the entire quest sequence block forever because they weren't in the right place at the magic moment. In most cases, a well written manager will not crash, even with missing animations - that should be a tested case. Deadly Pleasures requires the player to have a special "Patreon contributors only" animation pack. It says it works with the free version, but that's not true at all. Because it doesn't handle missing animations well, and because using the free animation pack leads to many missing animations, this results in broken quest progression on numerous occasions. I would suggest that this is not a good development pattern, unless you want players to start avoiding your mods due to a consistent expectation of nothing but broken quests. 8 ) Branching within Quests Skyrim quests, as designed by Bethesda, are not really intended to support branching within a quest. If you look at vanilla quests, they rarely introduce optional content. If they do it's usually a stage you can progress by either method (a), or method (b), or a stage with an optional step (c). Most quests progress with simple AND conditions. If you meet all the requirements, you go on to the next major stage. The flow of vanilla quests is typically sequential, (often) with no stages skipped, and stages only advancing. Some quests let you skip a stage here or there, or provide a basic OR in how you can progress. When they want to start a genuine branch, they usually launch a new quest to do it. The quest system is designed to support this model, and becomes awkward if used for other models. Quest stages can only get set to higher values. Stages have a concept of completion. Code is run on stage start, and on completion do nothing other than a SetStage(). Usually, new stages clean up the objectives of old ones. It's quite simplistic. While we have a function that is run on stage entry, there is no equivalent for stage exit (which is a serious flaw, and is probably why so many sloppily made quests don't clean-up objectives properly). There's an interesting bug/feature here ... if you SetStage to a LOWER stage number, the set will not change the stage, but the stage entry script will still execute! This can lead to modder confusion. You can definitely create more sophisticated logic, but Skyrim does nothing special to help you. Quests are designed to work the simple way I suggest above, and that's it. That is how the journal objective system is designed to work: do steps, in order, finish quest, success, get reward. There aren't many branches in Skyrim vanilla. There are some exclusive choices, but they're usually done by starting two quests and failing one of them when you finish the other. Civil War does this for Storm Cloaks vs Imperials vs Broker Peace. Using that model, it can launch a new quest any time, and have that quest shut-down competing branches. If you want to make vanilla-style quests, you should design like this. It's not a huge benefit, but it's a benefit. The alternative is that you have to write a quest system of your own in script. Misapprehension of this pattern leads to Delzaron coming unstuck sometimes, but most of his quests are linear and fit this model perfectly. Fish seems to "get" it, but still gets sloppy with objective clean-up. Sex Slaves permits branching, so it launches "competing" quests, but you can't complete them all successfully. While you can build multiple paths into a single quest, it's not really the intended pattern and it makes objective clean-up harder; there are ways to be rigorous about it, but Beth just don't bother; it's probably easier and cleaner to make a new quest. e.g. 10 Learn you must find the maguffin 20 Magguffin found - sets objectives "give maguffin to a Ulfric or Balgruuf" 30 Maguffin given to Balgruuf - start new quest Balgruuf's Maguffin 40 Maguffin given to Ulfric - start new quest Ulfric's Maguffin 50 Clean up objectives ... Completion vs 10 Learn you must find the maguffin 20 Magguffin found - sets objectives "give maguffin to a Ulfric or Balgruuf" 30 Maguffin given to Balgruuf - go to stage 100 40 Maguffin given to Ulfric - go to stage 200 100 Clean up common objectives from 10-40 110 Do stuff with Balguuf's maguffin... Go to stage 300 ... (various stages) 150 Complete Balgruff's maguffin quest-line 200 Clean up common objectives from 10-40 210 Do stuff with Ulfric's maguffin... ... (various stages) 260 Complete Ulfric's maguffin... Go to stage 300 300 Completion And if you want to unify clean-up ... 10 Learn you must find the maguffin 20 Magguffin found - sets objectives "give maguffin to a Ulfric or Balgruuf" 30 Maguffin given to Balgruuf - set Balgruuf flag - go to stage 50 40 Maguffin given to Ulfric - clear Balgruuf flag - go to stage 50 50 Clean up objectives from before (unified clean-up), branch on Balgruuf flag, go to stage if true 100 or 200 if false 100 Do stuff with Balguuf's maguffin... ... (various stages) 150 Complete Balgruff's maguffin quest-line... Clean up Balgruuf objectives ... Go to stage 300 200 Do stuff with Ulfric's maguffin... ... (various stages) 260 Complete Ulfric's maguffin... Clean up Ulfric objectives ... Go to stage 300 300 Clean up common objectives ... Completion See how much simpler it is if you don't do branches within the quest? Often, we'll see quest authors mush their stages together, performing multiple activities per stage to get around this. This muddy thinking often leads to them getting muddled about what a stage should do, or having poor stage planning and design. It also leads to "objective clean up in completion code" which then creates broken objectives when players SetStage from the console. Last Words A smart person learns from their mistakes. A really smart person learns from the mistakes of others. I know this seems like a hatchet job on poor Delzaron. I used his mods as an example, but he's not alone in doing this. I love what he's trying to do. I admire his persistence. His mods are consistently interesting, and raise all kinds of provoking possibilities. However, his scripting is a tail of tears, and I think it's worth examining why, so that others don't go down that same road and fall straight into the same potholes. There are other good/bad habits I didn't mention. Maybe you've come across some quest patterns you'd like to never see again?
- 9 comments
-
19
-
A lot of mods that have soft-dependencies have all kinds of nasty cross-mod issues that cause a CTD at game start, or simply break other mods that are involved in the mess. Often, the problems only manifest when three or more mods are involved. The way to avoid these problems completely is quite simple. The problem is created by a handful of bad patterns, and there is nothing mysterious or magical about it. There is a solid reason for why it happens, and why it can sometimes be quite complex to reproduce, or for a player to fix when setting up a new LO. In most cases, the cause of problems is a mod that has code to call some foreign mod in a quest script that auto-starts, and it doesn't check whether the ESP is present, it simply calls Game.GetFormFromFile and if it gets a None, it assumes the mod is missing. USLEEP does this FFS! It is the root cause of all that stupid spam it spews on every single game start. This pattern is toxic. Do not ever do this: Form foo = Game.GetFormFromFile(0x00123456, "Foreign Mod.esp") If foo != None TypeFromSomeOtherMod realFoo = foo As TypeFromSomeOtherMod ... do something with realFoo EndIf So what should you do? Follow the five rules to avoid ever referencing types that don't necessarily exist, and your mod should be much more stable with respect to soft-dependencies, even if you rely on a mod that is a confluence of trouble, such as SLIF. The Rules 1) Put all the mod interactions for a single foreign mod into a single global function. Do not (ever) mix mod interactions between different mods in the same file! 2) Do not interact with a type from a foreign mod in any function other than a global function. 3) Do not access a global function that performs an interaction with a foreign mod without first confirming that its ESP is present. 4) Do not access foreign mods during first start-up of the game. 5) Avoid access to foreign mods during OnLoad and equivalent events. You can see this pattern followed properly in Deviously Cursed Loot. SLD doesn't follow these patterns properly; there are several errors that need to be fixed. It seems to get away with it anyway, but it's better to be safe than sorry with Skyrim. But why? Quite simply, if you reference a type from a script file that doesn't exist, Skyrim doesn't know how to handle it. The type is garbage. It will either CTD, or - if you are lucky - the type will be incompatible with all objects and never take a value apart from None. To be sure we don't reference types that don't exist, we must make sure those types are not present anywhere in a script we might execute when that type's defining script doesn't exist. And if that defining type is bound to an ESP, it will also need that ESP, so we should check that exists first. The type only properly exists when its script files are present, and the best rule we have for determining the presence of the script files, is the presence of the ESP. This is important for other reasons too, because we need the ESP to populate pre-defined properties on foreign types. Clearly both ESP and script need to exist, but checking both creates an absurdly tight binding, and is busywork that requires special Papyrus extensions anyway. It's good enough to check for the ESP. It's not good enough to skip that check, because an object script without its ESP may be parsed but will still break your game because its an orphan: a class that has no possible instances. Only global scripts can operate properly without their parent ESP or ESM, because a global script cannot be instanced. By putting the interactions in a global function in a script that contains only global functions, we can be sure that our mod will never try to reference those types unless we explicitly call the global. The same is not the case for a script attached to a quest. If you attach a script to a quest, its papyrus instance will be created when the quest is started. If the quest is auto-start, that will be on first load of the game. So, if you reference a foreign type - even if due to control flow, you do not execute that reference - it is still processed by Skyrim when the potential calling script is loaded. Skyrim must know the type's signature, and to do that it instantiates the type, and to do that, requires an ESP. Using global scripts stops this, because they are not pre-instantiated, and they are only instantiated when executed, and executed when explicitly called. But we must be sure not to call those globals at sensitive times, of if the scripts (and types) they rely on do not exist, or cannot be instantiated. Thus, we check the ESP of the foreign mod exists before trying to call the globals, and we only call the globals from "safe" functions that will not run on first game startup. I'm simplifying a bit. It's really only an issue with scripts that are bound to objects, but those are the most common soft-dependency. Any other kind of script would be a global, and would have no persistent internal state and no properties. For such scripts the mere existence of the script object is enough. If it's missing, your game will not explode. Though the code that tries to call it won't work and will crash, merely having a reference to it in your own quest won't cause an issue at all, beyond the crashing of your script that is. Why must we avoid first game startup? This is important because the foreign types we want to reference may not even be loaded, even if the ESP exists. Skyrim loads the types when the ESP loads, and normally that happens in strict load order. But if we reference a type in our script, it will cause the script that defines that type to be loaded before the ESP that instances it. This is not well supported in Skyrim. Either way, we don't know the load order, and whether the other mods have loaded yet. This is why changing load order can sometimes fix issues. If your mod is not following the pattern cleanly, but loads really late, it might get away with it anyway. OnLoad is an edge case. OnLoad doesn't run on first load (strange, I know, but I believe this is on purpose so OnLoad can rely on initialization). So, mods that reference foreign mods in their OnLoad should be safe? They are. Mostly. In some cases, a player adds a mod during play. That mod may then get picked up by a "naughty" soft-depending mod that checks for soft-deps OnLoad, but the mod just added by the player might not have properly loaded. This is why checking in OnLoad is hazardous. If you don't add mods mid-play, it will be fine. And if you do, you may get away with it if the mod gets properly loaded before the OnLoad for the depending mod runs. SLD seems to get away with it in practice, but you shouldn't push your luck; I see the SLD behavior as a bug that needs to be fixed. Practical Examples So, where should we check for foreign mods? I believe the correct answer is in an OnUpdate handler. When OnLoad runs, it should set an int "checkSoftDeps" variable to 1. It should also set the presence of ALL soft-dep mods to false - keep a boolean flag for each one. When OnUpdate runs, it has a branch that runs if checkSoftDeps > 0 Inside that branch it increments checkSoftDeps If checkSoftDeps > 2, then run the handling code to check for soft deps, then reset checkSoftDeps to 0. This makes it impossible to run the checks prematurely, but only requires one variable. Inside the soft-dep check handler, we need to see if the ESPs are present. If the ESP index is not 255, then it is, and we can set the presence flag to true. e.g. In OnLoad: checkSoftDeps = 1 slifPresent = False aproposPresent = False In OnUpdate: If checkSoftDeps > 0 checkSoftDeps += 1 If checkSoftDeps > 2 slifPresent = 255 != Game.GetModByName("Sexlab Inflation Framework.esp") aproposPresent = 255 != Game.GetModByName("Apropos2.esp") checkSoftDeps = 0 EndIf EndIf In code that uses apropos: If aproposPresent && 255 != Game.GetModByName("Apropos2.esp") Actor aproposActor = MyModAproposShim.GetAproposActor() ... EndIf In the Global function file MyModAproposShim: Actor Function GetAproposActor() Global Apropos2Actors actorLibrary = Game.GetFormFromFile(0x0002902C, "Apropos2.esp") .... Return foundActor EndFunction Note how at the point of use, the mod ESP is checked again, even though we have the boolean? That's because the boolean may not get reset fast enough via OnLoad, but it saves us checking GetModByName over and over if the mod is never present. Note how only the global function, safe in its own file contains an actual TYPE from Apropos2: Apropos2Actors. When I wrote SLD, I was under the misapprehension that simply not using a type was enough. That is wrong. If the type is not loaded, and you load a script that references it, you can break the game. Not necessarily though, and that is where the complex results that Monoman wrote about originate. See my comments in the spoiler on first and second consumers. This topic has actually been written about by engine experts, but the posts are hard to find. Essentially, if you reference the type, and the mod isn't loaded, you will cause the type to be loaded if it can be. If that goes ok, then your mod may not cause a problem, but you may have now caused a type to load outside of the normal order of load ordering ... consequences of this can result in the type itself breaking, but if it ends up trying to load references to ANOTHER type that is itself later in the LO, and that's where things can go bad. If you start this chain, and any type is missing, Skyrim fails to instantiate the type, and code - in some other mod - may then try to use it anyway, and CTD. Thus if you follow the pattern, you stop other mods that aren't well-behaved, from breaking the game. Some things to think about...
- 19 comments
-
16
-
- papyrus
- modding help
-
(and 1 more)
Tagged with:
-
It's often the case that you need to handle a "sensitive" event in some mod code. These events are things like OnHit, OnAnimationEvent, and OnItemAdded. What these events have in common is that in some cases they can be produced in large busts. An event handler that takes too long handling those events can result in an overloaded script system that overflows its stack and gets suspended, with unpleasant results for your game. Another kind of event that exhibits this problem is one generated by a cloak, and it follows that trigger box events can also cause similar overloads. In all cases, the problem is the same, efficient handling of the events. While some will say "don't use cloaks ever", that's a gross over-statement that takes a dogmatic approach to cloaks. Problems have arisen because the pattern shown in the CK cloak tutorial is quite bad, and adding scripts with cloaks is generally a bad idea, but cloaks in general are no worse than any other event that can fire rapidly in bursts - probably less bad than an OnItemAdded running on the player. The central problem with script in these handlers is the basic problem of taking too long to execute. This is caused simply by doing too much in the handler script. Scripts that go off and potentially do heavy work are almost certain to cause an issue unless additional measures are taken. A favorite pattern is the "busy state", which uses Papyrus built-in states to avoid overload. In this pattern, after a successful call to the event handler, additional calls to the handler will do nothing unless the first call has completed. The code looks something like this: This approach is fine is you just want to know the event is being hit by something. It's good for situations like an OnHit event where you want to know the player is being hit in combat, but you don't need to handle every hit, just as many as you can - and the player won't really notice those hits you didn't process. But, quite frequently, the reason you're running an event handler is because you need to get all the events. You really don't want to miss any. This is most likely with an OnItemAdd, where you're looking for a particular item. An appropriate filter is the recommended solution to OnItemAdd performance risks, and that's great if you know exactly what items you are interested in, and the list is small. If the list is huge, or you don't know the items but simply that they have a certain keyword, or came from a certain mod, then filtering is probably unsuitable. Nevertheless, where you can use a filter, that should be your first approach, as filters are very good at reducing the number of event calls, so you don't have to run a lot of code on irrelevant items at all. But let's suppose a filter is not going to cut it. Imagine you are doing what I wanted to do recently, which is to detect every DD key the player obtains. There are now many mods that create their own uniquely flavored DD keys, and so it's not enough just to check for the default DD keys any longer - if it ever was. I could do this... There are no states needed in this case. It's not ... terrible ... the work done in the handler is strictly bounded, and once the _DFKeyFound global gets set, further calls early-out and do nothing. Though, of course, a massive inventory flood coming from emptying Sanguine's chest in SD+, or the prison confiscation chest, or similar, probably wouldn't ever set that value, and the script would run a lot of times. Possibly a couple of hundred times in a single burst - but it's not such a huge script it would bring down your game - it would just take a while to clear. But ... if you then piled more load on top, it might become an issue. So, the above code would probably be ok, but it's still a little worrying. It could be better. We could do less. What is the minimum we could do? One approach could be this: FormListAdd is for all intents instantaneous compared to any Papyrus execution; the cost is entirely dominated by the Papyrus overhead. Somewhere else there is a regular service routine that pulls everything out of the lists and deals with it. How that's done properly is a topic of its own, and I don't want to get stuck in that, so let's just pretend it's easy to iterate over each list and process the items. One list is mostly going to be full of "None". This is the least we could reasonably do in a handler, and it won't miss any items. The down side of this is that we absolutely must service those lists reliably or they will grow without bound, and probably cause a CTD. That is also probably an unacceptable risk. What if the Papyrus servicing the lists fails? Here's the compromise I came up with for DF: In this case, if the list is overflowing, we back off and stop adding - items will be lost - but this is better than creating a massively bloated list that is going to lag in processing anyway. In fact, with a limit of 1000, if we are skipping filling the list, it's almost certainly because the servicing routine has stopped running and is dead. Also, I took a little Papyrus time to determine whether to handle as item or base. This is a less clear-cut whether it's the right approach, but it saves time later in processing the list later, that is for sure. The alternative is to use the approach above and fill two lists (or the same list) with both inputs and discard all the None items later. Another approach is to discard non-uniques, which will filter out all the None items at the point of add - but those calls to StorageUtil are going to start using a bit more CPU if you do that. What's best? You'd need to profile in detail to know. I couldn't be bothered going that far this time. So, there is no straight answer to any problem, and no perfect solution. But sometimes the "busy" state pattern is not going to do what you want, and you need something else. Busy state invariably discards a lot of calls when you get a burst. It maintains performance, but the cost is lots of lost events. States can result in some hierarchic resolution of the state declarations, so they are more costly than they look, but I suspect it's still negligible. The problem is really losing all those calls that you made the handler to catch in the first place. Without detailed profile results it's hard to say exactly what would be the absolute best approach here; but profiling this sort of scenario in a meaningful way is not trivial. I can easily imagine some garbage profile results, but a useful measure might be how often we get a suspended stack.
- 6 comments
-
5
-
Hi, I plan to create a mod similar to 'Kidnapped by Rieklings', which I envision should have more scenes and be adaptable to various enemies. For example, I have already used CK to create 8 indoor cells for "bandits" and added "xmakerheading", 6-8 enemies, as well as some necessary furniture and overall room layout. Next, I plan to create more, including draugrs, riekings, and falmers. However, I have just come into contact with CK and papyrus, and I come from a non English speaking country, so I have very little knowledge about Mr. BenduOlo (mainly because translation software cannot perfectly convey the meaning of words), so my progress in learning is very slow. Additionally, as the official tutorial of beth does not involve anything related to sexlab, and I have inquired with the original author, I have not received any response. So, feeling helpless, I am here to ask a question and request assistance. Please forgive the disturbance from a complete beginner. My questions mainly focus on the following points, and I am eager for your detailed guidance, even if it is only one part: 1. How to trigger this mod? I have two ideas for this: 1. A defeated mod. 2. Trap. I am more inclined towards' traps', so I want to use it as an example. I hope that when the PC falls into a trap, the mod will be triggered and the PC will be transferred to a scene/cell that I have created. When transmitting, a 'black screen' is required, and a text box pops up saying 'You passed out, you don't know how long it has been, you have appeared in a strange place'. How should I proceed? 2. How can I avoid being sent with my followers? I do not intend to add followers in this scene to avoid unnecessary trouble and additional CPU burden, so it may be necessary to automatically disband the followers or have them wait in place when the character steps into a trap. Anyway, don't let her/him come here. How should I proceed? 3. How to make the highest level enemy (red "M") order the rape of PC after being teleported? That is to say, after the PC is teleported, it cannot be controlled by the player, and at the same time, the enemies (NPCs) in the scene will not automatically attack the PC. At this point, the enemy leader will mock the PC and start playing aggressive sexlab animations (currently, I have only created scenes for humans, and may soon add some scenes for "smart creatures"). How should I proceed? 4. How can I create an MCM option that allows players to decide how many times to play the sexlab animation? This is not only a matter of selectivity, but also involves' ending the event '. How should I proceed? 5. How to activate the 'End Event'? I also have three ideas for 'ending the event': 'execution', 'release', and 'rescue', and I hope the probabilities of the three can also be reflected in MCM. Regarding the 'execution', I may receive some 'animation support'. I have already conceived the relevant animation, and after the sexlab animation ends and the 'end' event is activated, the 'execution' animation will play, and the PC will eventually die. Release "means that the PC is abandoned by bandits and displayed naked in the most densely populated area of a town (while the player gains control of the PC). And 'Rescue' requires creating another scene, according to my plan, Ralf will play this hero. How should I proceed? The above are the questions I can think of at the moment. I know it's very complicated, and getting help seems like a pipe dream. However, I am also continuing to learn, and with the help of heroes, this process will be faster than ever before, and I will make more contributions faster. I hope I have luck.
-
I am trying to make a Skyrim race mod based on the WH40K Tau. I know how to make meshes but other than that I'm not too good with Skyrim modding therefore I decided to use the SkyDraenei mod as a baseline (due to the similarities), only editing the meshes and textures to fit the Tau race https://www.immyneedscake.com/skyrim-se-mods/skydraenei-race. I found a free-to-use female Tau model online (https://sfmlab.com/project/28240/) and converted it to .obj then to .nif and scaled it down in Outfit Studio. After that, I tried just replacing the Draenei body mesh with the converted Tau model, while also removing some of the unwanted parts of the Draenei mesh (like the tail and "hair tentacles"). I am not stupid enough to think that'd be all there is to do but I did hope that it would clear up some questions about the mod-making process. As you can see in the attached picture the body is T-posing and has those weird polygonal shapes on it. It doesn't cover the whole body because the mod uses separate meshes for hands, head, and hooves. The T-posing probably stems from a lack of bone-weighing. But the weird texture is a complete mystery to me. I tried applying a gray texture to the Tau body .nif in NifSkope (it seemed fine) but in-game it looked like the second screenshot until I turned on the racemenu and then it went back to polygons once more. I attached the .obj files and the .nif body file of the Tau girl. Any help is welcome, thanks! Tau Body.obj Tau Hand.obj Tau Scaled Down.nif
-
- skyrim
- modding_help
-
(and 5 more)
Tagged with:
-
Wanted to port the Marauder loincloth from Warsword Conquest for personal use but when I added it into the game it gave became invisible. This is my first time making Morrowind models so I'm not too familiar with it. Here are the meshes and textures: _marauder.NIF Norsca.dds
-
Managed to find the Fusion Girl conversion of Crimsomrider's mod, but so far no CBBE bodyslide as that's the preset I use. Was wondering if someone has already made one or if someone is willing to do so. Tried my hand at it and failed miserably.
-
- augmentation
- modding help
-
(and 1 more)
Tagged with:
-
I'm looking to extract DOA5 animations to blender. Fighting moves, defeat animations, taunts, etc. Hoping there's something like the tekken 7 animation viewer but i'll take whatever tool I can get my hands on to make it possible https://github.com/Kiloutre/BlenderTekkenDirect So what tool is best to achieve this? I looked around online already and I found noesis, camera motion / bone motion exporter, pc rigging, etc from here https://www.mediafire.com/folder/9zi2gt8dyllaj/doa5mod#9zi2gt8dyllaj http://modderbase.com/showthread.php?tid=1491 which one do I use? Are these even the tools that I'm looking for to get the job done? I literally just want to open the animations in blender. example: nyotengu punch: nyotengu model > nyotengu animation > animation plays in blender.
- 1 reply
-
- dead or alive 5
- modding
-
(and 3 more)
Tagged with:
-
Hey, I'm looking to hire someone to be my modding assistant/consultant for Skyrim AE. The general vision I have for my next playthrough is way too ambitious for my meager knowledge, involving hundreds of concurrent, synergizing mods and plugins (some of which are pretty extensive) rather than the two or three that I've dealt with in the past. To that end, I'll gladly pay an expert to help me incorporate as many of them as possible, as seamlessly as possible. (As far as payment goes, I'm open to negotiation.)
-
simple Patch for daytri's mindbreak and trauma framework?
Guest posted a topic in Technical Support - SexLab Framework
I have no mod dev experience (outside a scuffed but functional CIS droid army mod for Stellaris and a simple patch for Minecraft TFC blocks to function with Archimedes Ships), but i wanted to try my hand at a simple patch for the Mind Break and Trauma Framework, see spoiler below. Nothing special, just detecting certain things from sexlab or other mods and applying the appropriate values into the framework. You can do some work on this from the MCM, but I'm not sure how much and the UI just is a much worse way to do such things than normal coding. I guess what i'm wonering is "how do i even start"? would I need to install the CK? Can I just open up notepad++ and edit some plaintext JSONs like I've done for other games?- 1 reply
-
- modding_help
- modding help
-
(and 2 more)
Tagged with:
-
Hi Everyone, Sorry to be a bother but i cant find any information on how to get the extra girls in the Gravure Studio mod to work properly! I can select the girl in the movie select screen, however when the movie plays it is just whoever the girls parent model is (Alpha 152 or Phase 4). I've expirimented by moving some of the girls outfits from their autolink folder into the parent models autolink folder(eg move sayuri's files into phase 4's autolink folder.) However at best it will just display sayuris body with phase 4's head. Does anyone know how to organise the autolink folders in order to get the extra girls to work? Thanks so Much, Gvoux
- 5 replies
-
- dead or alive 5
- help
-
(and 2 more)
Tagged with:
-
Hi guys. Honestly, I don't feel good by making this post, I don't feel confortable by begging help with so basics things. Sorry for that and for my rusty english. I am facing problems with pak files. I cannot make any mod because everything I pack is ignored by the game. I don't know why, but it is obvious I'm doing something wrong, but I don't know what. I requested for help in reddit, some Discord channels and even Youtube and no one could explain me why is this happening. I think this forum is NOT for making basic modding tutorials, here there are a lot of excelents modders and you don't have enough time to waste with someone who doesn't even know how to pack a mod, but I'm here, begging for help to you guys because you are my last hope. If you don't know the answer, no one will know it for sure. I'm trying to mod Im@s game (Idol M@ster Starlit Season). Especifically, I want to mod the camera of that game, but that is another story. I would never be able to make that mod if I am not able to pack a simple mod. I modified S4UCameraConfig.uasset file and I made a pak file with that and .uexp files, but game does not do anything with my mod, like if I didn't do anything. I though it was because I had missed some important files inside the pak file. I wanted to be sure if the problem was the packing itself or there was another reason for this (like if I was missing some important file inside the pak file or something like that). So I decided to unpak a full-operative mod for this game (an english patch mod) and repacking it again. If everything was ok, the game should recognize the mod. Well... It wasn't ok. I unpacked the pak file with QuickBms (and with Unrealpak too) and inmediately repacked it again with UnrealPak with compression settings. The original pak size and the output pak size are the same (identical), the directory tree inside the pak files are identical too, but mine one doesn't work. I don't know why. I also tried with u4pak. No success. What am I doing wrong guys? I recorded a video that shows what I am doing. I hope you guys can see what I am doing wrong: EDIT: I uploaded another video where info can be seen more easily
- 1 reply
-
- help
- idolmaster
-
(and 4 more)
Tagged with:
-
Hey, I'm looking to hire someone to be my modding assistant/consultant for Skyrim AE. The general vision I have for my next playthrough is way too ambitious for my meager knowledge, involving hundreds of concurrent, synergizing mods and plugins (some of which are pretty extensive) rather than the two or three I've dealt with in the past. To that end, I'll gladly pay an expert to help me incorporate as many of them as possible, as seamlessly as possible. (As far as payment goes, I'm open to negotiation.)
-
Hi, so recently I am into TS4 modding, I am doing some OC and some reskins, I have a lot of stuff done, now I would like to release some of the reskins that the original modders actually allow it, but some don't and it pains me the fact that some original modders released their content YEARS ago and they are just gone by now, so their content, some of it are still working and alive but some are just gone forever! We will never see nor the original work nor the new resking because, for example, I made a reskin from a modder that released his last content in 2015, 7 years ago. How long do we have to honor the original modder request to not post a reskin based on his/her meshes? For example, look at these pictures: https://i.imgur.com/hXkjPyv.png https://i.imgur.com/wmgJr19.png Totally modded content by me, the tattoos are my new work, the leggings are a WIP by me, see the details, for example, the tag on the legging transparency, the almost unseable texture, that I also made from scratch, the panty, the saying on the panty, Totally new logo that I created... This is top stuff, when I release it your dicks will fall off the harder your jhon thomas will get, I assure you guys XD, also did the tanlines tattoo, better that the works that I know, totally new stuff but also WIP, the nails with the toe fingers coloring that works with a lot of modded stuff, it shows the color on the peeptoes or sandals like in the picture for example. those are also new stuff. BUT the shirt reskin is a reskin from an active modder that allows to do it if you take out the meshes, totally fine with it since he is an active modder and this stuff is his last work and it actually had a problem that I fixed so it actually works and the original is not, but anyway, since he is an active modder I have no saying what to do with his work and he is completely right about what to do with his meshes. I completely agree with that. BUT, it came to me thinking when I was doing the heels that I have some work that I am doing on very old stuff, 2015 and the last time that the modder actually posted something was 2015, these peeptoes are also from 2016 but the modder is more or less active and he/she doens't allow reskins so I came to questioning this. What do you guys as modders think about really old works, +5yo? For how long do we have to honor the original moddder wishes? I bet the guys that dropped their stuff don't even care about reskins and stuff but what about active modders with really old stuff that are not even updated anymore? Do you guys even recognize the peeptoe that my char is using? No, right? Because it is a completely new reskin, completely different from the original, I could even release as a new stuff and ppl wouldn't bat an eye, but I am asking because I like to respect ppl, So I am asking you guys that mod stuff, what do you guys think? Oh yes, the char is completely new also, it was made to look like my english teacher when I was a teenager, and it kinda looks, she was hot as fuck, maybe I release her someday. Also I would like to know about what do you guys think about patreon modders, are you guys into it, like releasing some free and some paid content? And those guys that release paid reskins?! wtf dudes...
-
I've been running around in FROST ( https://www.nexusmods.com/fallout4/mods/18898 ) recently, and was curious if I could spice it up a bit with some LoversLab mods, but since its an overhaul of Fallout 4, will the typical sex mod even work without some kind of patch? I saw an old thread about using FROST with RSE, but that was a few years ago and the link provided on that page goes nowhere (Mod was probably deleted?) I'm a bit iffy about downloading mods just to test them, i'm a bit selfish in the sense that i don't wanna waste time testing mods when i can be busy playing the actual game. So if anyone is currently running FROST with some SexLab mods feel free to share what your using, i will be very grateful.
-
I have been trying to create an event and several on_actions associated with this event. I'm hoping someone can help me understand : First off, I can't combine the "on_16th_birthday" and a custom on_action "on_betrothal". I'm guessing this is normal, but can someone confirm? Second, I cannot get my activity on_action working whatsoever. Here is the on_action in common/on_actions/activities (I changed some of the names to make it easier to read) : # On-action Last Minute Planning activity_tier_1 = { events = { ic_activity.1000 } fallback = activity_tier_2 } # On-Action - Guest Interactions activity_tier_2 = { random_events = { 100 = activity.2000 100 = activity.2001 } fallback = activity_tier_3_start } # Fallback - Start activity_tier_3_start = { events = { activity.3000 } } But the error log reads : [22:08:14][pdx_persistent_reader.cpp:229]: Error: "Unexpected token: =, near line: 3 " in file: "common/on_action/activities/ic_on_actions.txt" near line: 8 [22:08:14][pdx_persistent_reader.cpp:229]: Error: "Unexpected token: activity_tier_2, near line: 11 " in file: "common/on_action/activities/ic_on_actions.txt" near line: 17 [22:08:14][pdx_persistent_reader.cpp:229]: Error: "Unexpected token: activity_tier_3_start, near line: 20 " in file: "common/on_action/activities/ic_on_actions.txt" near line: 24 What am I doing wrong?
-
so yeah found this guide in case anyone else wants to try their hand oblivion remastered modmaking guide
-
2
-
- modding help
- tutorial
-
(and 1 more)
Tagged with:
-
I'm in the process of putting together a trait aimed at Cowplants and {4ore), getting flirty buffs from being eaten, and I'm curious if anyone has some insight or experience with Mod Constructor, because I'm trying to make custom interactions with the cowplant, like "Offer yourself to the Cowplant", etc but I'm a bit lost with the loot actions. Any tips? Appreciated!
-
- modding help
- sims4
-
(and 1 more)
Tagged with: