Jump to content

xkkmEl

Members
  • Posts

    260
  • Joined

  • Last visited

Everything posted by xkkmEl

  1. Please do report of success/failure of your lip file experiment!
  2. I have not full tested this, but I do use it in the context of forcegreets where it works like this: The game engine sort of mashes up the topicinfos that are linked by invisible continue. Your scripts execute correctly, but it you don't set a prompt text on the 2nd segment, the 2nd segment's follow up topic menu will show while the 1st segment is still being said. Add a dummy/ineffectual prompt on the 2nd segment of your invisible continue. It will then wait for the 1st segment to be done before evaluating the conditions for the possible continuations from the 2nd.
  3. Locations are hierarchical, so Bannered Mare is a separate location child of WhiterunHold... You do need the isInLocation, or isSameLocation test. However, if you refer to a colored map showing you borders between holds, most cells won't correspond to the map because they do not have a location set at all, and others will have a location that is not attached to any hold. I know of no way to fill in the gaps in order to get a clean and complete cell-to-hold mapping. In my WIP mod, I have processing that is triggered by a change of hold... I assume the player is in the last hold visited until he enters a cell that is positively attached to a different hold... The gaps are large... so very few cells have an actual location set.
  4. Add more traces to confirm the content of your variables and properties.
  5. You mean for the condition system? You need the conjunctive normal form... The wikipedia page does as good a job as anyone will do in explaining it. For your A & (B | C) example, you get: A (AND) B (OR) C (AND; though the very last one is a "don't care") It quickly gets hairier... and in such cases thinking of the negation of your condition is often simpler.
  6. Use Location.isSameLocation: Keyword property LocTypeHold auto ObjectReference testThis ObjectReference mapMarker if testThis.getCurrentLocation().isSameLocation( mapMarker.getCurrentLocation(), LocTypeHold) isThere() else isNotThere() endif Either that, or I didn't get what you're looking for.
  7. How about: ElseIf QI >= 4 && QI <= 23 && QI != 13 I use a lot of this construct as well: ElseIf myComplexCondition( args...) bool function myComplexCondition( params...) global if something return False elseif somethingelse return False elseif someotherthing return True else return somesimplecondition endif endfunction
  8. I play Skyrim LE, so results may vary. I can click on a creature in the console, and type "getav damageresistance". However, all I get is an error message. There is no such actor value in my game. There is however a damageresist actor value, which is zero for everything except NPCs wearing armor. I just checked in game with goats, wolves, bears and NPCs (both naked and in armor). The only methods I know for changing an actor value are (1) via script, using one of the actorvalue functions on Actor, or (2) using a magiceffect. I have not tested, but I suspect that although it is using an Armor record, the naked skin entry on the ActorBase is not counted in damageresist, only worn/equipped armor. You could try to make an "empty" armor (one with a base body but no actual armor layers) in the CK and have your bears wear that, perhaps even by assigning it an outfit in the CK's inventory tab. However, tinkering with the AV via script would be far simpler.
  9. There's also the player's OnMagicEffectApply, that will trigger when you consume the potion. I you don't want timeouts or empty bottles, you can use the OnMagicEffectApply or OnEffectStart events to add a potion back when it is consumed; you'll see it disappear and reappear immediately in the inventory.
  10. This new GreybeardMeditate nif works very well. I copied the nif to a different path to avoid any possible conflicts with other mods, and created a new furniture record in order to adjust keywords and a couple of flags. There is a slight quirk though. Playing a female Dragonborn with high heels, when I use placeAtMe to create the furniture reference, it places it some 4 inches too high... so I am actually levitating above the floor as I meditate . You can't use moveTo on furniture... it stays put where you created it... and besides I have no idea on how to test for high heels and the offset being applied. I could force-remove footwear, but then I'd need to figure out how to catch the exit animation event in order to put the footwear back on (btw, it does align my correctly with the floor if I remove my heels beforehand). Does anyone have tips on how to deal with this?
  11. Isn't it an AI package issue? If you just copied the encHare record, it comes by default with the DefaultCreatureSandboxEditorLocation4000 package, which allows it to wander anywhere within 4000 units (about 60 yards) of its CK location. It does not know about your X marker either. I did not check the details, but I suspect it will also easily activate it's combat override package, which will turn on a fleeing behavior that can send it even further away.
  12. I now award you the official title of 'experienced modder'. Welcome to the club.
  13. I'm pretty sure the formlist will sit in RAM all the time; the array definitely will. It is a cost. It will compete for loading textures and nifs. Not catastrophic since even if you have a few hundred it will amount to a couple of 100Ks of RAM, compared to 8M-40M for a typical texture file. Not optimal but workable, I estimate. Check your esp size, it will give you a good approximation.
  14. So how sure are you about the other part of your code line? csbMagTextHolderAlias[QuestIndex] If csbMagTextHolderAlias and QuestIndex are script properties or variables (not variables local to a function), they will be visible in game with the console command "sqv myquest". I suspect your array is not properly initialized, a common mishap when adding script variables/properties to an already running game.
  15. Replace the Utility.wait( 2.0) with While QuestToRestart.isStopping() Utility.wait( 0.1) endwhile More robust, more responsive.
  16. Your plan does work. And I can't think of anything better if you want an indefinite number of books. If you can think of a way to limit the number of books (like destroying or fading out older books to make room for the new), you'll end up with fewer objects to maintain.
  17. Aliases fill only as part of the quest start process. They do not scan continuously for matches. If you want a second go at filling an alias, you must stop the quest and restart it. With some care, you can put the quest in a continuous stop/start loop in order to check for new nearby matches every few seconds. Do let the game engine breathe a bit between iterations.
  18. I would not worry so much about the performance impact of creating 300 base objects and 300 references. It will gum up some RAM (~100K-200K), but not enough to make a real impact. I would worry about the tedium of filling that many records by hand. You do need to deal with the name field size limit though. SetName let's you use any string, but the text in the plugin has to fit a fixed sized records. I agree however that you should look for a more moderate approach. Does the player really need all 300 books at the same time. Are they so precious that having them disappear after a while, keeping only the last 20 for example, would be unacceptable?
  19. My alias fills do catch FF-refs without problems. There must be something else about the target ref that is failing the alias fill conditions. Test with a ActorBase that has its "unique" bit off. Turn on the "allow reserved" flag. Test with a quest reduced to this single alias. The console will give you much detail on its evaluated alias fill conditions if you start the quest with "startquest myquest". Minimizing the quest will simplify analyzing the output and reduce possible interactions with other aliases or preconditions.
  20. I am rather surprised the BQ01 letters retain their text. I had not thought that possible. Most likely, you'll find that the created letters do remember who/what oref was in the text replacement alias when it was created, but not the text itself. So it will not work with the setName method. In my own use, it is clear that despite the flag's name, "store text", the text itself is not stored in the created book.
  21. There are separate version of the CK for LE and SE. Similar but distinct. Though I have little experience with LItems and LNPCs, from other examples I would expect the game engine to proceed hierarchically, as Scorrp10 detailed, in selecting ActorBases and outfit items, resorting to randomness only when the records specifically call for it. It is however possible to have outfits with redundant or conflicting items, in which case the game will choose from the available options, sometimes randomly, sometimes selecting the "best" item; the LItem generation process itself does not care if it creates multiples of the same base item, or items that fill the same equipment slot.
  22. LeveledActor is very much like a LeveledItem; it's list of ActorBase objects to choose from when generating a Reference (an Actor). Not all actors are linked to a LeveledActor record. Most non baddies in fact are just simple Actors that are references to a simple ActorBase. You will notice that Actors have both a .getActorBase and a .getLeveledActorBase method. In the simple case they return the same ActorBase. However, if the actor is linked to a LeveledActor, these two methods will return different things. GetActorBase will return the ActorBase that was chosen from the LeveledActor list. GetLeveledActorBase will return a modified clone of that base (with an id 0xFFxxxxxx). Though it starts out as a "clone", the game will inject a bunch of data taken from the LeveledActor record, and computed from the ActorBase's skill data. I do not know in much detail exactly which fields are copied from where or computed nor how. I do believe however that the outfit data from the LeveledActor is copied into the clone.
  23. Wow. Thanks. Can't wait to experiment with it.
  24. I still don't know how to work with idles, or animations in general. I am hoping someone can provide a few hints... I would like to reuse the GreybeardMedite (furniture) animation. I am dynamically creating a furniture marker (marker = playerref.placeAtMe( furniture, 1, True)) and then activating it (marker.activate( playerref)). It works with some idles, like the BlessingKneelMarker, but not others. I don't really understand why. The furniture records are very similar. Is the difference in the nif? If so, what do I have to do to the nif to make it work for the player? Also, I can see that in some circumstances, you don't need a furniture. You can trigger idles with Actor.playIdle, or sendAnimationEvent. But most everything I try fails. I can see the name of the working animation events in the hkx files, but I don't know which events work or why others fail. Finally, I need to figure out when the idle is done... to chain more stuff, more animations, or other state changes. The mineOreScript does that by listening for animation events, but there again, when I see a promising event name in the hkx files, I never see those events triggering... except for the few that I find examples of in vanilla code (like the mineOreScript's pickaxe_exit event). PS: I know about dialogue animations, and idle lists in AI packages. They just don't work reliably enough or provide enough control for most of my use cases. Unless I am not using them right... in my current state of ignorance... PPS: I don't really care about nifs and hkx files... I just need proper reliable methods for starting idle animations and detecting their end.
×
×
  • Create New...