Jump to content

[Old] oblivion+skyrim resources!


Recommended Posts

Posted

need to get more help with work on scripts in general for the mod...

i personally have way to much to do to be able to get this out by myself before doc has a pre-release for SG...

 

need to try and get a prelim at least done for scripts.

Posted

hmm... might have to put this on hold after all >.<

 

still working on scripting as much as i can, cant do much else with current PC condition (le sigh etc.)

 

might upload some stuff (if i can get past learning most of the syntax) i script onto the SG wiki... still need to get script bits from doc :P

 

AI behaviors are going to be a bitch to setup for just general NPC and anything that might be set for PC.

working on form information based on names that 'might' be used in SG currently as a kind of placeholder...

Posted

Sbseed has our mod listed in this post as a "resource." All the mod(s) created by Jammer and I, (Cyanure) are not resourses.

we ask at the start of the post for the pleasure factory among other things,that those who wish to use our works in their mods ask and get our agreement to do so first.

Posted

Sbseed has our mod listed in this post as a "resource." All the mod(s) created by Jammer and I' date=' (Cyanure) are not resourses.

we ask at the start of the post for the pleasure factory among other things,that those who wish to use our works in their mods ask and get our agreement to do so first.

[/quote']

 

Actually, that reminds me of something I was meaning to bring up.

 

The sexout resources module (if I understand it right) bundles a lot of basics together, but it also has an interface so that 3rd party modders can register their stuff with the repository. The idea being that we wouldn't need to bundle every resource on the planet. Users add in whatever mods they want out of those available, modders add a script to load their items into our lists when the mod first loads, and thereafter their stuff can show up as loot, in treasure and junk lists, and be used by other mods if available.

 

So maybe that's a better way to go forward. What do you think?

Posted

Sbseed has our mod listed in this post as a "resource." All the mod(s) created by Jammer and I' date=' (Cyanure) are not resourses.

we ask at the start of the post for the pleasure factory among other things,that those who wish to use our works in their mods ask and get our agreement to do so first.

[/quote']

 

the one i was working on... separate from SG or any other mod, with some serious help from doc. and any mods are meant to be used as examples and to get ideas from or used as a guide, script/meshes/textures (unless granted, or sent the nif/dds files for specific use) will be done from scratch etc.... so only a resource in that respect.

 

 

The sexout resources module (if I understand it right) bundles a lot of basics together' date=' but it also has an interface so that 3rd party modders can register their stuff with the repository. The idea being that we wouldn't need to bundle every resource on the planet. Users add in whatever mods they want out of those available, modders add a script to load their items into our lists when the mod first loads, and thereafter their stuff can show up as loot, in treasure and junk lists, and be used by other mods if available.

 

So maybe that's a better way to go forward. What do you think?

[/quote']

 

thats an excellent idea... will save tons of time thats for sure.

just need to make sure that the mods that add use the same naming system when necessary etc.

Posted

Let's get this party started!

 

Scriptname SkySex_Warehouse_Marker_Script extends ObjectReference  
{let's try attaching properties to this, instead}

Idle 	property	anim	auto
{ The actual idle to play with PlayIdle }
string 	Property	name	Auto
{ name of the animation - this is what we'll search on }
string 	Property	mod		Auto
{ name of the mod - so we can SSG.Blowjob and AP.Blowjob without them interfering }
string 	Property	role	Auto
{ role in a sex act third part of the search key : generally "male" or "female", but could denote positions in an group animation }
Bool	Property	primary		Auto
{ the primary role is the one relative to which all the others are positioned }
float	Property	xoff		Auto
{y-distance relatuve to primary  }
float	Property	yoff		Auto
{ z-distance relatuve to primary  }
float	Property	zoff		Auto
{rotation relatuve to primary - 180 if you want the actor to turn around }
Float	Property	xrot	Auto
{ x-axis rotation relative to primary }
Float	Property	yrot	Auto
{ y-axis rotation relative to primary }
Float	Property	zrot	Auto
{ z-axis rotation relative to primary }
Float 	Property	duration	Auto
{ how long to run the act for. Only used for primary records }

 

Anything I missed?

 

[edit]

 

I missed that it needs to extend ObjectReference if we're to use PlaceAtMe to create an instance.

 

Also, the instantiation doesn't work. This is what I'm working from:

 

http://www.creationkit.com/Implementing_Linked_Lists

 

and this is what I'm trying to do:

 

Scriptname SkySex_Resources_Script extends Quest  

Import Debug

FormList Property AnimationList  Auto  
{ list of all animations }
Idle Property m_doggie auto
{ male standing doggie animation from JoshNZ's AP - purely as a test animation - needs permissions before we can distribute. }
idle property f_doggie auto
{ female half of same }
ReferenceAlias Property proto_alias  Auto  
{ prototype for the animation record - script is extended to have extra properties. Using a forced alias to keep the prototype object locked in memory }

Event OnInit()
trace("skysex oninit: proto = " + proto_alias)
;
; add female test animation
;
add_animation(					\
	a_animation = f_doggie, 	\
	a_name = "Standing Doggie", \
	a_mod = "AP", 				\
	a_role	= "female", 		\
	a_primary = true			\
)

;
; and male test anim. We'll need a lot of these in due course.
; the bright side is that if you set a quest property, you should be able to 
; add your own from your own scripts. 
;
; NB: must test that...
;
add_animation(					\
	a_animation = m_doggie, 	\
	a_name = "Standing Doggie", \
	a_mod = "AP", 				\
	a_role	= "male",	 		\
	a_primary = true, 			\
	a_xoff = 40.0				\
)
EndEvent

;
; function to return a new animation record
;
; currently these are actually gold coins that pile up in an isolated cell
;
SkySex_Warehouse_Marker_Script function new_animation()
;
; this is the instance we return
;
SkySex_Warehouse_Marker_Script instance

;
; get the object ref and the base form
;
ObjectReference oref = proto_alias.GetReference();
form base = oref.GetBaseObject()

;
; create the instance with some bracketting debug chatter
;
trace("creating new record from " + proto_alias)
instance =  oref.PlaceAtMe(base, 1, True, False) as SkySex_Warehouse_Marker_Script	
trace("instance created: " + instance);

;
; return it
;
return instance
EndFunction

function add_animation(										\
Idle a_animation, 										\
string a_name, string a_mod, string a_role, 			\
bool a_primary=False, 									\
float a_xoff=0.0, float a_yoff=0.0, float a_zoff=0.0, 	\
float a_xrot=0.0, float a_yrot=0.0, float a_zrot=0.0, 	\
float a_duration=0.0									\
)
;
; get a new animation record
;
SkySex_Warehouse_Marker_Script rec = new_animation()

;
; shout, if that failed for any reason
;
if rec == None
	MessageBox("Error: record not created")
	Return
EndIf

;
; fill out the fields
;
rec.name 	= a_name
rec.anim 	= a_animation
rec.mod 	= a_mod
rec.role	= a_role
rec.primary	= a_primary
rec.xoff	= a_xoff
rec.yoff 	= a_yoff
rec.zoff 	= a_zoff
rec.xrot	= a_xrot
rec.yrot 	= a_yrot
rec.zrot 	= a_zrot
rec.duration	= a_duration

;
; add it to the form list
;
AnimationList.AddForm(rec)
EndFunction


 

The only problem is that it doesn't work. Still. I get a "cannot be placed" error for some reason.

 

[edit]

 

OK. PlaceAtMe needs a base object, wihch probably means one without the script on. So maybe if I copy something like a coin, and script the base object...

 

[edit]

 

And it works. Let me add some comments and I'll post the update version.

 

[edit]

 

Updated the script.

 

OK, that lets us store animations with as much supporting detail as we need to make them go. The next thing I need is a lookup function.

Posted

sweet thanks... i have been trying to do some stuff on my end(with scripting), mostly failing tho i think lol

ill save this in the txt doc im using as a script holder for now.

 

hopefully i can get something usefull done script wise, now that i have my wings 3d setup again i can start working on meshes (i hate the nif file format)... maybe i can get some variants started by monday.

Posted

sweet thanks... i have been trying to do some stuff on my end(with scripting)' date=' mostly failing tho i think lol

ill save this in the txt doc im using as a script holder for now.

 

hopefully i can get something usefull done script wise, now that i have my wings 3d setup again i can start working on meshes (i hate the nif file format)... maybe i can get some variants started by monday.

[/quote']

 

Cool. Here, have a lookup function for the above

 

SkySex_Warehouse_Marker_Script Function lookup(string name, string mod, string role="", bool primary=False)
;
; variables. We need a counter and the limit for the loop
;
int i = 0
int lim = AnimationList.GetSize()

while i < lim
	SkySex_Warehouse_Marker_Script rec

	rec = match_test(i, name, mod, role, primary)
	if rec != None
		Return rec
	EndIf

	i+= 1;

EndWhile
return None	
EndFunction

SkySex_Warehouse_Marker_Script function match_test(int index, string name, string mod, string role, bool primary)
SkySex_Warehouse_Marker_Script rec

;
; get the record
;
rec = AnimationList.GetAt(index) as SkySex_Warehouse_Marker_Script

;
; if the name is wrong, or it's from the wrong mod, it's not the one we want
;
if rec.name != name || rec.mod != mod
	return none
endif

;
; if no role specified, we return want the primary animation
;
if role == "" &&  rec.primary
	return rec
endif

;
; otherwise we're looking to match the role
;
if rec.role == role
	return rec
EndIf

;
; role was wrong - return none and let the caller try the next one
;
return None
EndFunction

 

Compiles, not tested yet :)

 

[edit]

 

tested, infinite loop. Hopefully fixed about. Also, I only posted half the code...

Posted

damn man, you are a scripting wizard or something... takes me several hours just to try and come up with something that might work (after trying to understand the syntax itself, now i remember why i hate to script for anything that i didnt already create lol).

 

thanks again.

Posted

damn man' date=' you are a scripting wizard or something... takes me several hours just to try and come up with something that might work (after trying to understand the syntax itself, now i remember why i hate to script for anything that i didnt already create lol).

[/quote']

 

Thank you.

 

Here's a tester script. I've got a scene that moves two actors into roughly the right position, and then fires up the idles. This is the same script modified to use the lookups.

 

Scriptname SSG_SexTester_Script extends Quest  

Import Debug 

ReferenceAlias 	Property 	boy  		Auto  
{ the male part of the procedings }
ReferenceAlias 	Property 	girl  		Auto  
{ his partner }
Idle 			Property 	BoyIdle		Auto	; I am fighting down an urge to call this property "BoyGeorge"
{ idle animation for the boy role }
Idle 			Property 	GirlIdle	Auto
{ and one for the girl }
Quest Property SkySexQuest  Auto  
{ quest with all the idles in it }

Function setup()
debug.trace("SSG_SexTester_Script setup")
EndFunction

Function start_idles()
trace("start_idles")
SkySex_Resources_Script anims = SkySexQuest as SkySex_Resources_Script
SkySex_Warehouse_Marker_Script b_rec
SkySex_Warehouse_Marker_Script f_rec

boy.GetActorReference().UnequipAll()

b_rec = anims.lookup("Standing Doggie", "AP", "male")
f_rec = anims.lookup("Standing Doggie", "AP", "female")

actor b_act = boy.GetActorReference()
actor g_act = girl.GetActorReference()

b_rec.do_position(g_act, b_act)
f_rec.do_position(g_act)

b_act.PlayIdle(b_rec.anim)
g_act.PlayIdle(f_rec.anim)
EndFunction

 

Comment out the positioning code and that works well. By which I mean it works exactly as well as the original did, with about 6 inches of air between the participants. The Positioning code is adapted from AP and uses functions added on to the data record:

 

Scriptname SkySex_Warehouse_Marker_Script extends ObjectReference  
{let's try attaching properties to this, instead}

Import Debug

Idle 	property	anim	auto
{ The actual idle to play with PlayIdle }
string 	Property	name	Auto
{ name of the animation - this is what we'll search on }
string 	Property	mod		Auto
{ name of the mod - so we can SSG.Blowjob and AP.Blowjob without them interfering }
string 	Property	role	Auto
{ role in a sex act third part of the search key : generally "male" or "female", but could denote positions in an group animation }
Bool	Property	primary		Auto
{ the primary role is the one relative to which all the others are positioned }
float	Property	xoff		Auto
{y-distance relatuve to primary  }
float	Property	yoff		Auto
{ z-distance relatuve to primary  }
float	Property	zoff		Auto
{rotation relatuve to primary - 180 if you want the actor to turn around }
Float	Property	xrot	Auto
{ x-axis rotation relative to primary }
Float	Property	yrot	Auto
{ y-axis rotation relative to primary }
Float	Property	zrot	Auto
{ z-axis rotation relative to primary }
Float 	Property	duration	Auto
{ how long to run the act for. Only used for primary records }

function do_position(actor prime, actor second=None)
if primary
	position_prime(prime)
Else
	position_second(prime, second)
endif
EndFunction

function position_second(actor prime, actor second)

;
; get the x, y and z position of the primary
;
; we're going to align the secondary relative to the prime, 
; so we need prime's position
;
float xp = prime.GetPositionX()
float yp = prime.GetPositionY()
float zp = prime.GetPositionZ()

;
; and prime's rotation too, since second is going to be rotated relative to prime
;
float xa = prime.getangleX()
float ya = prime.GetAngleY()
float za = prime.GetAngleZ()

;
; second's position is the same as prime's adjusted for any offsets
; the offsets use prime's frame of reference, so we need to allow for that
;
; I'm only doing this for the z-axis, which amounts to which way the player is facing
; if we need more, I'll see about doing the trig
;
float xs = xp + xoff * math.sin(za)
float ys = yp + yoff * math.cos(za)
float zs = zp + zoff

;
; set the position
;
trace("setting 2nd: " + xs +"," + ys + "," + zs);
second.SetPosition(xs, ys, zs)

float xv = mod_angle(prime.getangleX(), xrot)
float yv = mod_angle(prime.GetAngleY(), yrot)
float zv = mod_angle(prime.GetAngleZ(), zrot)

second.SetAngle(xv, yv, zv)

second.KeepOffsetFromActor(prime,0,40,0 ,afCatchUpRadius = 5.0)
EndFunction

function position_prime(actor prime)
;
; prime position. 
;
float xv = prime.GetPositionX() + xoff
float yv = prime.GetPositionY() + yoff
float zv = prime.GetPositionZ() + zoff

;
; set it modifed by offsets defined.
; I don't know why we might want to do this, but might as well be consistent
;
trace("setting prime: " + xv +"," + yv + "," + zv);
prime.SetPosition(xv, yv, zv)

;
; modified angles. Most common use here would be turn the primary to face the other way
;
xv = mod_angle(prime.GetAngleX(), xrot)
yv = mod_angle(prime.GetAngleY(), yrot)
zv = mod_angle(prime.GetAngleZ(), zrot)

;
; and set the angle
;
prime.SetAngle(xv, yv, zv)

EndFunction

float function mod_angle(float base, float inc)
float f = base + inc

while f > 360
	f -= 360
EndWhile
return f
EndFunction

 

The positioning code seems to work, but I'm getting collision errors, and the male gets moved. I know this was a problem with earlier sex mods, but I can't see how Josh solved it. I'm betting on the SexyBodySpell he adds, but that's as far as I've got.

 

Incidentally, Fore's solution to this problem is to use paired animations. That would solve the collision issues and guarantee sync ... but it doesn't help when we get to scenes with 3 or more participants. So I need to solve this one anyway.

 

That said if anyone has any suitable paired sex anims, I have a few ideas about adding them in.

 

Posted

The easiest solution I found for fixing the collision problem is to togglecollisions, but I noticed that when the animations are made in Max you can bind the root for both actors to the same position, but move the COM for each charcter out farther. As for the animation synching maybe you can add a delay to both actors before the idles start playing?

 

I can try working with paired animations to see if I can generate any, but you would need a way to make them play. I can make some animations and just dump them in this thread if you want to play with them to see if there are any improvements.

 

The only other solution I can think of, a really sloppy one which I wouldn't recommend is to generate skeletons that have no havok objects, or havok objects with 0.0 mass, but that would mess everything up unless it was still running off a custom race like with Josh's mod.

 

I'm in over my head with scripting now I think I spent too much time away from papyrus and forgot alot of stuff, so for now I'll stick to animations only.

Posted

All of this scripting talk is making me dizzy. I don't understand any of this :s

 

Anyone's got a dumbed down kiddy version for the noob in this thread? I'm willing to learn some basic scripting to a degree...

Posted

The easiest solution I found for fixing the collision problem is to togglecollisions' date=' but I noticed that when the animations are made in Max you can bind the root for both actors to the same position, but move the COM for each charcter out farther. As for the animation synching maybe you can add a delay to both actors before the idles start playing?

[/quote']

 

Yeah, I noticed Debug.ToggleCollisions(). I've been trying to avoid that since it'll work for the player as a participant (and with the player controls disabled) but it'd be a pain for sex scenes not involving the player.

 

Or can you turn off the collisions, position the actor, and then turn the back on again. I'm not sure how collisions work at that level of detail, so it may be worth trying

 

I can try working with paired animations to see if I can generate any' date=' but you would need a way to make them play. I can make some animations and just dump them in this thread if you want to play with them to see if there are any improvements.

[/quote']

 

OK, cool. I can certainly make them play.

 

The only other solution I can think of' date=' a really sloppy one which I wouldn't recommend is to generate skeletons that have no havok objects, or havok objects with 0.0 mass, but that would mess everything up unless it was still running off a custom race like with Josh's mod.

[/quote']

 

Yeah, I wondered about the skeleton too. I'd sooner not go the custom race route if I can avoid it. Too many problems.

 

I'm in over my head with scripting now I think I spent too much time away from papyrus and forgot alot of stuff' date=' so for now I'll stick to animations only.

[/quote']

 

No problem. I can do the scripting stuff :)

 

All of this scripting talk is making me dizzy. I don't understand any of this :s

 

Anyone's got a dumbed down kiddy version for the noob in this thread? I'm willing to learn some basic scripting to a degree...

 

Well' date=' your best friend to get started scripting are the tutorials on the CK.

 

Beyond that...

 

The problem with sex animations is that we need two animations to play in sync, and to line up correctly. To make that happen, we need to track a lot of information.

 

  • We need to know what the animation idles are, for all the actors
  • We need to know if either actor needs moving before the start
  • We need to know if either of them need rotating
  • We need to know which one to keep still and which one(s) to move
  • We need to how far to move or rotate the actors
  • We need to know how long the show lasts

 

So most of the scripts I posted above are about storing and fetching that information.

 

Now usually in programming, the practice is to collect related information together, into what is called a data structure. Now Papyrus doesn't let you define new data structures in the classical sense. But you can extend existing scripts. That means they keep all their old data and functions, but you can add new ones.

 

In this case, I'm duplicating the single gold coin object and giving it an extended script with fields to store the information above. The duplication and script-adding parts happen in the CK, so you won't find them in the posted code. Also in the CK, I've created an isolated interior cell, disconnected from tamriel, and dropped one of my extended cold coins onto a slab. That gold coin, and the copies of it that I'm going to make are going to form our data structures.

 

OK. I'm running out of steam a little here. I'll try and pick this up tomorrow if folks are interested.

 

Posted

the CK doesnt allow for storage of more than one anim data per file does it?...

 

dont suppose we could store that information within the skeleton side of the nif files either (even if we could i doupt there is any way to access that information)...

 

i wonder if its possible to have a dummy anim file coded/scripted to pass calls to true anims saved in separate files?!... that would blast the anims situation wide open and then some.

Posted

I'm still confused with paired animations though since there are two other roots that need to be included. I don't know if there are paired skeletons in a file either because I've been looking and all I see are the animations; the only one that doesn't involve a kill sequence is for hugging. I am trying to get them to load up so I can find out what other objects are needed in the scene the for the animation sequences.

 

Actually I figured out how to generate paired animations, but what I didn't realize was that they actually do use two separate animations, not one single file containing transforms for both skeletons. Some of the paired animations have a variable amount of paired roots, which is annoying, but as long as you stick to one that has the two nodes named Paired Root and 2_ havok shouldn't have any trouble exporting. I'll be back again to upload some examples later once you have a way of calling them. I am also assuming that Paired Root and 2_ should remain in the same place for both files or things won't line up.

 

All Paired Root does is move the NPC Root of each actor to that spot, 2_ still doesn't seem to be do anything though, I might replace an existing paired animation just to see what happens :P death by hugging I suppose?

Posted

i wonder if its possible to have a dummy anim file coded/scripted to pass calls to true anims saved in separate files?!... that would blast the anims situation wide open and then some.

 

What we can do (which might do what you want) is set up sequences of animations in the hkx file. These are basically Havok's "behavior graphs" where "graph" is used in the sense of "network"' date=' and they seem to be reflected in the structure of the Actor Actions in the animation menu. I don't know if we have all the bits we need to make new ones though.

 

All Paired Root does is move the NPC Root of each actor to that spot, 2_ still doesn't seem to be do anything though, I might replace an existing paired animation just to see what happens :P death by hugging I suppose?

 

That was going to be the first thing I tried :)

 

I'm thinking of doing a brain dump on the subject of havok, xml and the rest here. I think I have a chunk of it worked out, but there are still bits that are a mystery to me. So if I spread the wealth a bit, maybe N heads will prove better than N-1.

 

Posted

What are you hunting?

 

Well' date=' I want to work out how the various hkx files link together. I want to work out if we can do a skysex_female.hkx and a skysex_male.hkx and reference them from existing files. If we can do that then we minimise the chances to break the main behavior file, and we can do what we want in our own sandbox.

 

And I want to make proper behavior graphs. So if you have a sex loop, we can have the principles getting into position, and the a number of different loops that can select randomly, so we don't always see the same movements. Then, at the end, we can have them both get back up. I want to work out how Josh turned off the collision. (It's not the skeleton: can it be done in hkx - it's worth looking into). And I want to get some of this understanding shared, because the more people who know this stuff, the better tools we'll have and the more creative applications we will see.

 

Never mind, I don't want to know....

 

:D

 

Oh, all right. In that case I won't tell you :P

 

Posted

Here's a link to what I have so far.

 

Animations are a bit more broken. I monkeyed with the scene to disentangle this from SSG and haven't got round to fixing the bits fully.

 

And I've not added canderes cowgirl animation yet, because I just remembered about it now.

 

It uses FNIS and assumes you've got JoshNZ's mf animations copied into slots 51 to 57. In particular you want a male one in 52 and a female in 54.

 

The test cell is Skysex_Test - you'll need to coc in. There's a button by the top of the stairs to start the action - such as it is at the moment.

 

[edit] d/l removed - use later version instead

 

Do please note that this is not a working _anything_. It's a test mod, shared here so other modders can take a look at what I've been doing.

 

[edit]

 

JeCvG.png

 

Fixed the breakages. Just adding cowgirl now.

Posted

I forgot to mention that some animations, specifically HJs and BJs require that SetHeadTracking(False) or the actor will end up looking at the players face and rotate the ribcage upward as a result. I am about to experiment with lip synching because I just now found out that the facial animations are stored somewhere else, not like NIF or KF in Oblivion.

Posted

I forgot to mention that some animations' date=' specifically HJs and BJs require that SetHeadTracking(False) or the actor will end up looking at the players face and rotate the ribcage upward as a result. I am about to experiment with lip synching because I just now found out that the facial animations are stored somewhere else, not like NIF or KF in Oblivion.

[/quote']

 

I've added a headtrack field to the data format so it can be disabled on a per-animation basis. Also added the cowgirl animation. It isn't positioned correctly yet and the boy/girl roles are wrong, but it's at least added. There is now one button for each act.

 

There's currently no way to stop the act once it starts. That has to change

 

http://www.mediafire.com/?3ehomyr07h0r58i

 

[edit]

 

As before: coc Skysex_test to start. Mod is buggy beyond belief and only realy interesting to another modder

Posted

i wonder if its possible to have a dummy anim file coded/scripted to pass calls to true anims saved in separate files?!... that would blast the anims situation wide open and then some.

 

What we can do (which might do what you want) is set up sequences of animations in the hkx file. These are basically Havok's "behavior graphs" where "graph" is used in the sense of "network"' date=' and they seem to be reflected in the structure of the Actor Actions in the animation menu. I don't know if we have all the bits we need to make new ones though.

 

All Paired Root does is move the NPC Root of each actor to that spot, 2_ still doesn't seem to be do anything though, I might replace an existing paired animation just to see what happens :P death by hugging I suppose?

 

That was going to be the first thing I tried :)

 

I'm thinking of doing a brain dump on the subject of havok, xml and the rest here. I think I have a chunk of it worked out, but there are still bits that are a mystery to me. So if I spread the wealth a bit, maybe N heads will prove better than N-1.

 

 

Go for it, I'd love to see what sort of animations you have so far, and be able to tinker with them. Though, the xkhcmd conversion to kf -> 3dsmax import is still kicking my ass at the moment.

 

As for the looping, you might want to look at how the intro and loop animations for existing vanilla stuff works, such as the 1hm_attackrightintro and the mag_chargeloop.

Posted

Actually most of the animations I've made just used the 3rd person skeleton text file uploaded by SaidenStorm. It was uploaded to help CherryHotaling. I haven't imported any animations in a while from vanilla skyrim, but as long as you use the havok 2010 addon and use the file he's posted you can make completely new hkxs. I gave up on conversions between max and kfs to hkxs because they were so buggy before; they may work now, but I still found that the easiest thing to do is just use the havok exporter.

 

I'll post a short tutorial later on what I do to generate a non paired animation and how to use havok to export the animations correctly. If you are curious as to how to do it at this moment look at the hkxcmd threads. I can't remember if it was the first or second one that had the information on havok and exporting. There are other issues if you decide to use a skeleton with more bones than what is found in the original skeletons, because you have to rebuild them from scratch to include collisions, robes and a bunch of other crap I don't remember. I've only made about 4 animations so far and as said before theres issues with actor collisions, so I may slow down.

Posted

OK, start of brain dump: I'm a bit pushed for time so I'm going to split this up into installments.

 

This one is going to over the basics. I'm trying not to assume too much knowledge here, so bear with me if I start stating the obvious.

 

*********

 

Havok, XML and Skyrim

 

The Basics

 

The main problem with adding animations to Skyrim has been with Havok Behavior, the animation tool used by Bethseda. Havok behavior files have the extension .hkx and can include animations as well as "behavior graphs", which are large, complex animations made up out of lots of smaller parts.

 

We don't have the tools to edit hkx files directly, but we can convert them into a format that we can edit. TheFigment has a tool called hkxcmd that can turn .hkx files into XML files. You can get hkxcmd from nexus. As the name may suggest, it's a command line tool, so you'll need to run it from a command line prompt, or else set up a .bat file. More on that in a bit.

 

XML is a markup language very similar to HTML. It represents data structures by blocks that start with and end with name> with all the substructures embedded between those tags. The cool thing about XML is that you can edit it with any text editor. Notepad will do, but I'd recommend a proper programming editor. Notepad++ is a good choice, if you're not sure what to use.

 

And because we can edit the xml, we can add new records into it. And then turn it back to .hkx using hkxcmd again. Which means that if we understand what all the structures are doing we can add all the new stuff we like.

 

The catch lies in understanding the format, of course. The main behaviour file is mt_behavior.hkx and it results in a huge XML file with a lot of records that look very similar, and where the meaning of the data isn't always immediately apparent.

 

Luckily we don't need to understand all of it; for now, we just need enough to add in new records.

 

[edit]

 

Utterly unrelated, but turning off collisions while the animations are starting, and adding a tenth-of-a-second delay between the two loops, and everything seems to be working fine.

 

NGB8Z.png

 

Still can't turn the animations off yet, and I need to work on the positioning of the cowgirl animations. But this is getting close :)

 

Posted

OK. Slightly premature in my celebrations. It seems I'd forgotten that the CK takes into account what colour t-shirt you wear when you sit down at tke keyboard. Madly, one of the animations fires, the other starts and stops again.

 

Damned if I can see what I'm doing wrong.

 

But ... a lot of the comments on beth forums are to the effect that spells are a more effective way to deliver animations. And I just worked out how JoshNZ gets his spells to take effect just be adding them to the actor - they're abilities, of course.

 

So... I'm trying to repackage the animations as a spell effect. Of course, now I need a new way to vary the spell animation, since I can't pass strings to the spell. And suddenly I know what the tokens are for in AP. He's using them to select animations.

 

Now I reckon I can reduce that to a single integer - the offset into the formlist. And I further reckon I can store that in a keyword. So maybe I can do without the tokens.

 

[edit]

 

Also put in some time with Perl and XML::Twig today. I'll do a bit more brain-dumping on that shortly.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...