DavidJCobb

Joined 8 March 2022
Revision as of 01:42, 4 June 2015 by imported>DavidJCobb (→‎Scratchpad: What packages to use to make merchants go to a specific area and sell.)

Subpages

Rotation library
A library for working with rotations in Skyrim. If you need to position and rotate one object relative to another, this'd be the code to do that.

Current projects

Atronach Crossing
A home decoration mod with a dual focus on customization and usability. Currently in early development. Already features many "firsts" in Skyrim, such as bookshelves that can be moved around at run-time.
At version 0 iteration 66 as of February 20th. A demo video of v0i66 can be seen here.

Scratchpad

  • Applying AI packages to an NPC
    • You generally don't apply a single package to NPC, but rather a list. For example, each meal that the NPC eats would be powered by separate packages.
    • List of default AI packages (WIP)
    • Possible ways to make merchants
      • SandboxAndKeepEyeOn package set to keep the merchant in the cell where they'll sell wares. Set them to keep an eye on the player. Modify their merchant faction data to make them sell in the area.
      • SitTarget package targeted to a CounterLeanMarker. Modify their merchant faction data to make them sell in the area.
  • Creation Kit bugs
    • Embedded render windows (that is, those found inside dialog boxes) will steal focus onmouseover.
    • The Creation Kit is somewhat crash-prone when trying to select navmesh edges while cover is being drawn, or recently after Find Cover Edges has been used.
    • Edge selection is generally broken when working with navmesh cover anyway.
    • The Creation Kit does not ignore placed effects (e.g. fog) when placing navmesh vertices, or when using the "drop to ground" tool on navmesh vertices. So that's great.
    • When editing a terrain heightmap, the Flatten Vertices tool may decide, for no readily apparent reason, to behave as though your brush size were five times larger than it was actually set to.
  • Combining multiple vanilla statics into a single NIF
    • Programs needed:
      • NifSkope
      • NifUtilsSuite
        • Make sure this is configured properly. It needs to know where NifSkope's nif.xml is, and it needs to be able to access that file.
    1. Create NifUtilsSuite template file.
      1. Pick the vanilla static whose collision is most representative of the combined static you're building. If you're adding stuff onto a building, pick the building.
      2. Extract its NIF and open it in NifSkope. Delete every block that isn't the root block, a BSXFlags, or a bhkCollisionObject.
      3. Save this stripped-down NIF.
    2. Create the merged static, minus collision.
      • You can copy and paste NiTriShapes from NIF to NIF. Paste all of your statics' NiTriShapes into a single file (under the root node).
      • You can reposition a NiTriShape by selecting it in the sidebar, and then editing its Translation and Rotation in the bottom pane.
      • You can rename a NiTriShape (to keep track of them easier) by selecting it in the sidebar, and then double-clicking the "Txt" icon shown next to the name in the bottom pane.
      • Be sure to delete all collision-related information (which should pretty much just be any bhkCollisionObject blocks).
    3. Create the merged collision mesh.
      1. Use NifUtilsSuite's ChunkExtract to rip each individual static's collision mesh as a NIF. Make sure that ChunkExtract sets NiTriShape names from the collision material.
        • NiTriShape Name: From material
      2. Use NifSkope to combine the individual collision meshes into a single mesh, similarly to how you combined statics earlier. Do not rename any NiTriShapes.
    4. Apply the merged collision mesh to the merged static using NifUtilsSuite's ChunkMerge.
      • Use the template file you created earlier.
      • Be aware that this will overwrite the input file. You should probably create a backup of your merged static.
      • Use "mesh data" as the Collision Source, and "name of NiTriShape" as the Collision Material.
  • Common pitfalls when creating combined statics
    • It seems that NifSkope doesn't always use the right Euler conventions for Skyrim. As such, rotation values won't work quite the same way as they do in the Creation Kit.
    • NifUtilsSuite needs to be able to access NifSkope's nif.xml. If that file is in an administrator-only location (e.g. Program Files), you will need to run NifUtilsSuite as an administrator.
    • NifUtilsSuite will crash if you accidentally tell it to read from a non-existent file, so maybe don't do that. Check your pathnames.

Code snippets

Quality? Functionality? Efficiency? Here, I guarantee nothing!!

Is an ObjectReference an item?

Works as well as is possible given the methods available to us.

Bool Function IsItem(ObjectReference akObject)
   Form akForm = akObject.GetBaseObject()
   If !akForm
      return false
   EndIf
   If akForm as Book
      ;
      ; SKSE grants read access to the Playable flag for books.
      ;
      return (akForm as Book).IsTakeable()
   EndIf
   If (akForm as Ammo) || (akForm as Armor) || (akForm as Ingredient) || (akForm as Key) || (akForm as MiscObject) || (akForm as Potion) || (akForm as Scroll) || (akForm as SoulGem) || (akForm as Weapon)
      ;
      ; Other object types don't have a script-accessible player flag. Sux.
      ;
      return true
   EndIf
   return false
EndFunction