the moment I figured that Emma achieved such things I was bound to do it myself. And guess what, it's easier and faster made then engineering a hotkey script...

So the easy way is to make copy of any things related to follower system inside...if you know how to do that. I assume not everyone does, this is why I've made this tutorial.
1. Setting up the Global
You'll first need to set up a global, like this:
http://imageshack.us/photo/my-images/855/quest10.jpg/
Name it like ever you want but use extensive prefixes, which is probably a good idea for all new forms you create...you'll never know.
2. Setting up the Quest
Now set up a quest like this:
http://imageshack.us/photo/my-images/69/questp.jpg/
You're perfectly ok to set up dialogue and quest scripts/aliases inside one and the same quest. I pulled my custom dialogue into a second quest because I also planned on other things I wanted to do...so don't get irritated by that.
3. Setting up the Alias
Now set up the alias like this:
http://imageshack.us/photo/my-images/834/quest3y.jpg/
Ignore the additional AWC_ prefixed packages, they're part of my custom mod. Also notice that I did not yet made custom factions and packages to be put into the alias. It will work like that, but if you really plan on doing your own custom follower frame work, you'd probably want to customize the factions and packages too. Basically you'll just need to make copys from the vanilla factions and packages. The packages get accesed automatically when your follower is apllied to this alias, and the factions are basically just used as instances for conditions inside the dialogue options.
4. Setting up the FollowerAlias Script
Use this script as example:
Now notice one thing. When setting up scripts for the first time, you'll get tons of error messages. But don't worry bit for bit it will all come together and once all script and script fragments are set up, the compiler will no longer itch about it. Make sure to customize any instance inside this script that is refering to a property, use extensive prefixes.
5. Setting up the quest objective
Now set up a quest objecive like this:
http://imageshack.us/photo/my-images/829/quest2k.jpg/
6. Setting up the DialogueFollowerScript
Use this script as an example:
Now this is the most critical part. You'll get tons of error messages here at first. You'll probably have to work them off bit by bit. Don't get mad while doing this. Just so you notice, I've left out the complete Animal part of the vanilla script. But once you get this tutorial done, it's probably easy to import animals.
7. Setting up the Follow Dialogue Topic
Set up a new topic like this:
http://imageshack.us/photo/my-images/4/quest4t.jpg/
Notice that the script page covers the script fragment windows. You'll need to fill the script fragment window (end) with the code between ;BEGIN CODE and ;END CODE. As usual the compiler will give you a fight cause you didn't set up the quest property inside the script yet. To achieve that simply click OK on the topic and reopen it to be able to modifie the source script. Then pull in the quest property.
8. Setting up the Wait Dialogue Topic
Set up a new topic like this:
http://imageshack.us/photo/my-images/849/quest5.jpg/
9. Setting up the share inventory Dialogue Topic
Set up a new topic like this:
http://imageshack.us/photo/my-images/443/quest6e.jpg/
10. Setting up the command Dialogue Topic
Set up a new topic like this:
http://imageshack.us/photo/my-images/651/quest7.jpg/
11. Setting up the dismiss Dialogue Topic
Set up a new topic like this:
http://imageshack.us/photo/my-images/21/quest8e.jpg/
12. Setting up the recruit Dialogue Topic
Set up a new topic like this:
http://imageshack.us/photo/my-images/141/quest9.jpg/
You'll first need to set up a global, like this:
http://imageshack.us/photo/my-images/855/quest10.jpg/
Name it like ever you want but use extensive prefixes, which is probably a good idea for all new forms you create...you'll never know.
2. Setting up the Quest
Now set up a quest like this:
http://imageshack.us/photo/my-images/69/questp.jpg/
You're perfectly ok to set up dialogue and quest scripts/aliases inside one and the same quest. I pulled my custom dialogue into a second quest because I also planned on other things I wanted to do...so don't get irritated by that.
3. Setting up the Alias
Now set up the alias like this:
http://imageshack.us/photo/my-images/834/quest3y.jpg/
Ignore the additional AWC_ prefixed packages, they're part of my custom mod. Also notice that I did not yet made custom factions and packages to be put into the alias. It will work like that, but if you really plan on doing your own custom follower frame work, you'd probably want to customize the factions and packages too. Basically you'll just need to make copys from the vanilla factions and packages. The packages get accesed automatically when your follower is apllied to this alias, and the factions are basically just used as instances for conditions inside the dialogue options.
4. Setting up the FollowerAlias Script
Use this script as example:
Spoiler
Scriptname AWC_FollowerAliasScript extends ReferenceAliasAWC_FollowerControlQuestScript Property AWC_FollowerControlQuest AutoEvent OnUpdateGameTime() ;kill the update if the follower isn't waiting anymore If Self.GetActorRef().GetAv("WaitingforPlayer") == 0 UnRegisterForUpdateGameTime() Else; debug.trace(self + "Dismissing the follower because he is waiting and 3 days have passed.") AWC_FollowerControlQuest.DismissFollower(5) UnRegisterForUpdateGameTime() EndIf EndEventEvent OnUnload() ;if follower unloads while waiting for the player, wait three days then dismiss him. If Self.GetActorRef().GetAv("WaitingforPlayer") == 1 (GetOwningQuest() as AWC_FollowerControlQuestScript).FollowerWait() EndIfEndEventEvent OnCombatStateChanged(Actor akTarget, int aeCombatState) If (akTarget == Game.GetPlayer()); debug.trace(self + "Dismissing follower because he is now attacking the player") (GetOwningQuest() as AWC_FollowerControlQuestScript).DismissFollower(0, 0) EndIfEndEventEvent OnDeath(Actor akKiller); debug.trace(self + "Clearing the follower because the player killed him.") AWC_MaximumFollowerCount.SetValue(0) Self.GetActorRef().RemoveFromFaction(CurrentHirelingFaction) Self.Clear() EndEventGlobalVariable Property AWC_MaximumFollowerCount Auto Faction Property CurrentHirelingFaction Auto
Now notice one thing. When setting up scripts for the first time, you'll get tons of error messages. But don't worry bit for bit it will all come together and once all script and script fragments are set up, the compiler will no longer itch about it. Make sure to customize any instance inside this script that is refering to a property, use extensive prefixes.
5. Setting up the quest objective
Now set up a quest objecive like this:
http://imageshack.us/photo/my-images/829/quest2k.jpg/
6. Setting up the DialogueFollowerScript
Use this script as an example:
Spoiler
Scriptname AWC_FollowerControlQuestScript extends Quest GlobalVariable Property AWC_MaximumFollowerCount AutoReferenceAlias Property FollowerAlias AutoFaction Property DismissedFollower AutoFaction Property CurrentHireling AutoMessage Property FollowerDismissMessage AutoMessage Property FollowerDismissMessageWedding AutoMessage Property FollowerDismissMessageCompanions AutoMessage Property FollowerDismissMessageCompanionsMale AutoMessage Property FollowerDismissMessageCompanionsFemale AutoMessage Property FollowerDismissMessageWait AutoSetHirelingRehire Property HirelingRehireScript Auto;Property to tell follower to say dismissal lineInt Property iFollowerDismiss Auto ConditionalFunction SetFollower(ObjectReference FollowerRef) actor FollowerActor = FollowerRef as Actor FollowerActor.RemoveFromFaction(DismissedFollower) If FollowerActor.GetRelationshipRank(Game.GetPlayer()) &--#60; 3 && FollowerActor.GetRelationshipRank(Game.GetPlayer()) &--#62;= 0 FollowerActor.SetRelationshipRank(Game.GetPlayer(), 3) EndIf FollowerActor.SetPlayerTeammate() ;FollowerActor.SetAV("Morality", 0) FollowerAlias.ForceRefTo(FollowerActor) AWC_MaximumFollowerCount.SetValue(1) EndFunctionFunction FollowerWait() actor FollowerActor = FollowerAlias.GetActorRef() as Actor FollowerActor.SetAv("WaitingForPlayer", 1) ;SetObjectiveDisplayed(10, abforce = true) ;follower will wait 3 days FollowerAlias.RegisterForUpdateGameTime(72)EndFunctionFunction FollowerFollow() actor FollowerActor = FollowerAlias.GetActorRef() as Actor FollowerActor.SetAv("WaitingForPlayer", 0) SetObjectiveDisplayed(10, abdisplayed = false)EndFunctionFunction DismissFollower(Int iMessage = 0, Int iSayLine = 1) If FollowerAlias && FollowerAlias.GetActorRef().IsDead() == False If iMessage == 0 FollowerDismissMessage.Show() ElseIf iMessage == 1 FollowerDismissMessageWedding.Show() ElseIf iMessage == 2 FollowerDismissMessageCompanions.Show() ElseIf iMessage == 3 FollowerDismissMessageCompanionsMale.Show() ElseIf iMessage == 4 FollowerDismissMessageCompanionsFemale.Show() ElseIf iMessage == 5 FollowerDismissMessageWait.Show() Else ;failsafe FollowerDismissMessage.Show() EndIf actor DismissedFollowerActor = FollowerAlias.GetActorRef() as Actor DismissedFollowerActor.StopCombatAlarm() DismissedFollowerActor.AddToFaction(DismissedFollower) DismissedFollowerActor.SetPlayerTeammate(false) DismissedFollowerActor.RemoveFromFaction(CurrentHireling) DismissedFollowerActor.SetAV("WaitingForPlayer", 0) ;hireling rehire function HirelingRehireScript.DismissHireling(DismissedFollowerActor.GetActorBase()) If iSayLine == 1 iFollowerDismiss = 1 DismissedFollowerActor.EvaluatePackage() ;Wait for follower to say line Utility.Wait(2) EndIf FollowerAlias.Clear() iFollowerDismiss = 0 ;don't set count to 0 if Companions have replaced follower If iMessage == 2 ;do nothing Else AWC_MaximumFollowerCount.SetValue(0) EndIf EndIfEndFunction
Now this is the most critical part. You'll get tons of error messages here at first. You'll probably have to work them off bit by bit. Don't get mad while doing this. Just so you notice, I've left out the complete Animal part of the vanilla script. But once you get this tutorial done, it's probably easy to import animals.
7. Setting up the Follow Dialogue Topic
Set up a new topic like this:
http://imageshack.us/photo/my-images/4/quest4t.jpg/
Notice that the script page covers the script fragment windows. You'll need to fill the script fragment window (end) with the code between ;BEGIN CODE and ;END CODE. As usual the compiler will give you a fight cause you didn't set up the quest property inside the script yet. To achieve that simply click OK on the topic and reopen it to be able to modifie the source script. Then pull in the quest property.
8. Setting up the Wait Dialogue Topic
Set up a new topic like this:
http://imageshack.us/photo/my-images/849/quest5.jpg/
9. Setting up the share inventory Dialogue Topic
Set up a new topic like this:
http://imageshack.us/photo/my-images/443/quest6e.jpg/
10. Setting up the command Dialogue Topic
Set up a new topic like this:
http://imageshack.us/photo/my-images/651/quest7.jpg/
11. Setting up the dismiss Dialogue Topic
Set up a new topic like this:
http://imageshack.us/photo/my-images/21/quest8e.jpg/
12. Setting up the recruit Dialogue Topic
Set up a new topic like this:
http://imageshack.us/photo/my-images/141/quest9.jpg/
Spread the tutorial whereever you want. Just quote for the BB code. Make me some followers. And Chesko...make me a UFF...

I'm entirely sure I've forgot something. Please let me now and I'm going to make the tutorial complete if something is missing.