[Tools] - You got a letter from WHAT?

Post » Wed Jun 20, 2012 2:02 pm

Custom Couriers:


OK, after quite a bit of fiddling, I have managed to make a custom courier that (sort of) works in a manner similar to the existing ones, but will track you down anywhere. It is fairly complicated and, like the existing couriers, driven by a quest.

First, make a copy of the NPC you want to use and strip off the AI information so it has no packages and no agro radius behavior. Make it cowardly and "helps nobody" as well. Make as many variations as you want, and give them a name easy to find (Like prefixing it with WICC (World Interactions Custom Courier))

Then, make a copy of any container in the game and empty out the loot options. Give it an easy to find name as above, perhaps WICCC prefix (WI Custom Courier Container)

Make a custom global variable for the Item Count (the number of items in the current container)

Next, Make a copy of the courier cell, or create a new cell of your own if you prefer. Put an instance of each of your stripped down NPCs in it, and set them all to "Starts Disabled". Make one or more Custom Container instances in there as well (You'll see why in a moment) - You will also need one Xmarker with a distinctive name (WICCXMarker for example) - That's all you need in the cell.

Create a copy of a small hard to see object (A charcoal stick works well) and give it a memorable name (WICCDropPoint for example)

Create a Keyword like "WICCSpawnPointKeyword"

Create an XMarkerActivator type that has the afforementioned Keyword attached. Place at least 3 of these in hard to see spots in major cities that have their own cells like Solitude, Markarth, Windhelm, etc. The reason for this is, you don't want the courier to spawn outside the walls of the town if the player is inside, since this will make it so the courier cannot reach the player.

Next, build a quest that starts game enabled and allows repeated stages, and make an alias for each of your Custom Courier types, picking them in the render window, and an alias for each of the containers, also picking them in the window. Also make an alias "Courier" and an alias "Container" and pick the courier and container you want to use by default. The last alias is one for the cell marker.

The Quest stages and their associated fragments should be:

0:
; Startup Stage - Return here when Deliveries complete.;Debug.Notification("Custom Courier in his home cell")	UnregisterForUpdate() ; Make sure to cancel previous delivery's updates, so we're not registered twice.	RegisterForUpdate(20)	CourierScript.StateChange("Waiting")
100:
;Item added to courier box. Look for a place to start.; Check optional references now.; Debug.Notification("Custom Courier has a letter!")CourierScript.StateChange("Seeking")
200:
;Courier found the player. Make DeliveryCourierScript.StateChange("Delivering")DeliverScene.Start()
300:
; Delivery Complete. Courier will run away now.CourierScript.StateChange("Departing")

The Courier alias should have to following packages attached to it, in this order:

1: A travel package, targeted onthe player, with the conditions
GetDistance (Courier to Player) > 1000.0
GetGlobalValue(Your global item count variable) >= 1.0
2: A follow player package with just the Item Count test.

3: A "Flee from target" package set to the player with no conditions.

This will make the courier travel to the player and then follow him so long as there is something in the container. Once the container is empty, the courier will then leave.

Here is the Courier Script I used:

Spoiler
Scriptname WICustomCourierScript extends Quest  import UtilityReferenceAlias Property CourierCellMarker AutoReferenceAlias Property Courier Auto ; The courier currently in use. Alternate versions below.ReferenceAlias Property WolfCourier AutoReferenceAlias Property SpiderCourier AutoReferenceAlias Property WerewolfCourier AutoReferenceAlias Property DeerCourier AutoReferenceAlias Property FoxCourier AutoReferenceAlias Property FlameCourier AutoReferenceAlias Property DwarfSpiderCourier AutoReferenceAlias Property ContainerAlias AutoGlobalVariable Property ItemCount  Auto ; Current container and item count. Alternate versions below.ReferenceAlias Property DwLgContainer Autoint property DwLgCount AutoReferenceAlias Property DwMedContainer Autoint Property DwMedCount AutoReferenceAlias Property DwSmContainer Autoint Property DwSmCount AutoReferenceAlias Property HiveContainer Autoint property HiveCount AutoReferenceAlias Property BarrelContainer Autoint property BarrelCount AutoReferenceAlias Property CoffinContainer Autoint property CoffinCount AutoBool Function DisableDeliveries(Bool DisableMe = True) ; Allows you to turn off deliveries, in case you want to fiddle with the containers and courier settings without interruption.    If DisableMe        While GetState() != "Waiting" ; wait until the courier is finished with any deliveries. Just want to make sure it stays disabled once it is.        EndWhile        GoToState("Disabled")        return True    else;Debug.Notification("Enabling Courier")        GoToState("Waiting") ; Courier will enable itself when it has something to deliver.        Return False    endifEndFunctionFunction SetRandomContainer() ; Picks a random container    int Which = RandomInt(1,6)    if Which == 1        ChangeContainer("Hive")    elseif Which == 2        ChangeContainer("Coffin")    elseif Which == 3        ChangeContainer("Barrel")    elseif Which == 4        ChangeContainer("Small")    elseif Which == 5        ChangeContainer("Medium")    else        ChangeContainer("Large")    endifEndFunctionFunction SetRandomCourier() ; Picks a random courier.    int Which = RandomInt(1,7)    if Which == 1        ChangeCourier("Wolf")    elseif Which == 2        ChangeCourier("Spider")    elseif Which == 3        ChangeCourier("Werewolf")    elseif Which == 4        ChangeCourier("Deer")    elseif Which == 5        ChangeCourier("Fox")    elseif Which == 6        ChangeCourier("Flame")    else        ChangeCourier("Dwemer")    endifEndFunctionFunction StoreContainerQuantity() ; Saves quantity of the current container if changing containers, in case there is something still in there.  When we change back, it will restore the value.    ObjectReference Current = ContainerAlias.GetRef()    If Current == DwLgContainer.GetRef()        DwLgCount = (ItemCount.GetValue() as int)    elseIf Current == DwSmContainer.GetRef()        DwSmCount = (ItemCount.GetValue() as int)    elseIf Current == DwMedContainer.GetRef()        DwMedCount = (ItemCount.GetValue() as int)    elseIf Current == HiveContainer.GetRef()        HiveCount = (ItemCount.GetValue() as int)    elseIf Current == BarrelContainer.GetRef()        BarrelCount =( ItemCount.GetValue() as int)    else ; Only the coffin is left.        CoffinCount = (ItemCount.GetValue() as int)    endifEndFunctionFunction ChangeCourier(String Which);Debug.Notification("Changing Courier: " + Which)    While Courier.GetRef().IsEnabled() || Updating ; If a courier is currently trying to deliver something, wait til it's done.        Wait(1.0)    endWhile    Updating = True ; Don't spawn a new courier or change containers while we're changing courier types.    if Which == "Wolf"        Courier.ForceRefTo(WolfCourier.GetRef())    elseif Which == "Spider"        Courier.ForceRefTo(SpiderCourier.GetRef())    elseif Which == "Werewolf"        Courier.ForceRefTo(WereWolfCourier.GetRef())    elseif Which == "Deer"        Courier.ForceRefTo(DeerCourier.GetRef())    elseif Which == "Fox"        Courier.ForceRefTo(FoxCourier.GetRef())    elseif Which == "Flame"        Courier.ForceRefTo(FlameCourier.GetRef())    elseif Which == "Dwemer"        Courier.ForceRefTo(DwarfSpiderCourier.GetRef())    else ; Default to Dwarven Spider courier        Courier.ForceRefTo(DwarfSpiderCourier.GetRef())    endif    Updating = FalseEndFunctionFunction ChangeContainer(String Which) ; Change to the specified container, and update the Item Count to match it's contents.;Debug.Notification("Changing Container: " + Which)    While Courier.GetRef().IsEnabled() || Updating ; If a courier is currently trying to deliver something, wait til it's done.        Wait(1.0)    endWhile    Updating = True ; Don't spawn a new courier or change courier types while we're switching containers.    StoreContainerQuantity() ; Saves the quantity in the current container, in case a delivery failed. We can go back to it later, but that's the responsibility of the mod writer to check.    if Which == "Hive"        ContainerAlias.ForceRefTo(HiveContainer.GetRef())        ItemCount.SetValue(HiveCount)    elseif Which == "Coffin"        ContainerAlias.ForceRefTo(CoffinContainer.GetRef())        ItemCount.SetValue(CoffinCount)    elseif Which == "Barrel"        ContainerAlias.ForceRefTo(BarrelContainer.GetRef())        ItemCount.SetValue(BarrelCount)    elseif Which == "Small"        ContainerAlias.ForceRefTo(DwSmContainer.GetRef())        ItemCount.SetValue(DwSmCount)    elseif Which == "Medium"        ContainerAlias.ForceRefTo(DwMedContainer.GetRef())        ItemCount.SetValue(DwMedCount)    elseif Which == "Large"        ContainerAlias.ForceRefTo(DwLgContainer.GetRef())        ItemCount.SetValue(DwLgCount)    else ; Default to large Dwarven Box container        ContainerAlias.ForceRefTo(DwLgContainer.GetRef())        ItemCount.SetValue(DwLgCount)    endif    Updating = FalseEndFunctionfunction addItemToContainer(form FormToAdd, int countToAdd = 1)    ContainerAlias.GetRef().addItem(FormToAdd, countToAdd)            ;add parameter object to container    ItemCount.Value += 1endFunctionfunction addRefToContainer(objectReference objectRefToAdd)    ContainerAlias.GetRef().addItem(objectRefToAdd)            ;add parameter object to container    ItemCount.Value += 1endFunctionfunction addAliasToContainer(ReferenceAlias refAliasToAdd)    addRefToContainer(( refAliasToAdd.getRef() as ObjectReference))EndFunctionfunction GiveItemsToPlayer()    ItemCount.SetValue(0)    ContainerAlias.GetRef().RemoveAllItems(Game.GetPlayer())    Debug.Notification("Item(s) Added.")EndFunctionObjectReference Function FindBeaminLocation() ; Used if we are not in an area with preset courier spawn points. Release 3 bouncersObjectReference PlaceTarget = Game.GetPlayer().PlaceAtMe(MarkerType,1)    ObjectReference[] Bouncer = new ObjectReference[3]    PlaceTarget.MoveTo(Game.GetPlayer(),5000.0,5000.0,5000.0)    Bouncer[0] = PlaceTarget.PlaceAtme(BouncerType,1)    PlaceTarget.MoveTo(Game.GetPlayer(),-5000.0,-5000.0,5000.0)    Bouncer[1] = PlaceTarget.PlaceAtme(BouncerType,1)    PlaceTarget.MoveTo(Game.GetPlayer(),-5000.0,5000.0,5000.0) ; Place them at 3 corners of a square.    Bouncer[2] = PlaceTarget.PlaceAtme(BouncerType,1)    Wait(5.0) ; Let them fall to the ground. We don't want to bounce our poor courier around too much.    ObjectReference sorthold    if Game.GetPlayer().GetDistance(Bouncer[0]) > Game.GetPlayer().GetDistance(Bouncer[2])        SortHold = Bouncer[2]        Bouncer[2] = Bouncer[0]        Bouncer[0] = SortHold    endif    if Game.GetPlayer().GetDistance(Bouncer[0]) > Game.GetPlayer().GetDistance(Bouncer[1])        SortHold = Bouncer[0]        Bouncer[0] = Bouncer[1]        Bouncer[1] = SortHold    endif    if Game.GetPlayer().GetDistance(Bouncer[1]) > Game.GetPlayer().GetDistance(Bouncer[2])        SortHold = Bouncer[2]        Bouncer[2] = Bouncer[1]        Bouncer[1] = SortHold    endif    ObjectReference Loc1 = Bouncer[0]    ObjectReference Loc2 = Bouncer[1]    ObjectReference Loc3 = Bouncer[2]    ObjectReference BILoc    if Loc3 && Loc3.GetDistance(Game.GetPlayer()) <= 10000.0 ; Didn't fall through the world		    BiLoc = Loc3    endif    if !BiLoc && Loc2 && Loc2.GetDistance(Game.GetPlayer()) <= 10000.0 ; Ditto previous comment		    BiLoc = Loc2    endif    if !BiLoc	    BiLoc = Loc1    endif    return BiLocEndFunctionFunction StateChange(String Which)    GoToState(Which)EndFunctionBool Updating = FalseEvent OnUpdate()    GoToState("Waiting") ; Starts us in the waiting state. Just in case we somehow got in the empty state.EndEventState Waiting    Event OnUpdate() ; Make sure all variables are reset.    Updating = False    WhereToGo = None	   Courier.Getref().MoveTo(CourierCellMarker.GetRef())    Courier.GetRef().Disable()	    If ItemCount.value >= 1.0        SetStage(100)	    endif    EndEventEndStateState Seeking   Event OnUpdate() ; First, find a map marker near the player.    if Courier.GetRef().GetDistance(Game.GetPlayer()) <= 500.0        WhereToGo = None ; Clear out the property for the next delivery.        SetStage(200)    elseif Courier.GetRef().IsEnabled() && Courier.GetRef().GetDistance(Game.GetPlayer()) > 30000.0 ; Player has eluded the courier. Put it away.        WhereToGo = None ; If at first you don't succeed...   	    Courier.Getref().MoveTo(CourierCellMarker.GetRef())   	    Courier.Getref().Disable() ; Go to sleep until the next update cycle.    endif    if !Updating && Courier.Getref().IsDisabled() ; Courier is not in the world yet, and we're not already trying to place one.        Updating = True        If !WhereToGo ; If we haven't updated yet this delivery            if ReloadOptionals.IsRunning()                ReloadOptionals.Stop()                Wait (1.0)            Endif            ReloadOptionals.Start() ; Force a reload of the optional aliases in case we're in a city cell.            ReloadOptionals.SetStage(0)            Wait(2.0)        endif        ObjectReference Loc1 = Gvar.Near        ObjectReference Loc2 = Gvar.Mid        ObjectReference Loc3 = Gvar.Far        if Loc3            WhereToGo = Loc3        endif        if Loc2 && (!Loc3 || (Loc3 && Game.GetPlayer().GetDistance(Loc3) > 10000.0))            WhereToGo = Loc2        endif        if Loc1 && (!Loc2 || (Loc2 && Game.GetPlayer().GetDistance(Loc2) > 10000.0))            WhereToGo = Loc1        Endif        if !WhereToGo || Game.GetPlayer().GetDistance(WhereToGo) < 900.0 ; No location found yet, or it's too close. (Player is in a cell with no viable markers)            WhereToGo = FindBeaminLocation()            if WhereToGo ; Found a spot!                Courier.Getref().MoveTo(WhereToGo)                Courier.Getref().Enable()            endif        else            Courier.Getref().MoveTo(WhereToGo)            Courier.Getref().Enable()        endif        Updating = False    endif;float DeltaX = Game.GetPlayer().X - Courier.GetRef().X;float DeltaY = Game.GetPlayer().Y - Courier.GetRef().Y;float DeltaZ = Game.GetPlayer().Z - Courier.GetRef().Z;Debug.Notification("Courier Seeking: "+DeltaX+","+DeltaY+","+DeltaZ) ; Show the player where the courier is for testing.   EndEventEndStateState Delivering    Event OnUpdate()	    If ItemCount.value =http://forums.bethsoft.com/topic/1360040-tools-you-got-a-letter-from-what/= 0		    SetStage(300)	    endif    EndEventEndStateState Departing    Event OnUpdate(); Debug.Notification("Courier Leaving")	    If !Game.GetPlayer().HasLOS(Courier.GetRef())   	    Courier.Getref().MoveTo(CourierCellMarker.GetRef())   	    Courier.Getref().Disable()        Updating = False			 SetStage(0)	    endif    EndEventEndStateState Disabled    Event OnUpdate() ; Courier is out. Come back later.;        Debug.Notification("Courier Disabled")    EndEventEndStateObjectReference Property WhereToGo AutoActivator Property BouncerType AutoActivator property MarkerType AutoQuest Property ReloadOptionals  Auto  CourierSpawnPointScript Property Gvar Auto

OK, since there is no way apparently to make an alias recheck it's conditionals and reload on an "always running" quest, We will need to make a second quest to load the spawn points if the player is in a town.

Note the Quest property ReloadOptionals - That will be a quest that has 3 aliases for the closest, next closest, and third closest spawn points in the nearby areas. They are all "Find Matching", "Closest", and "In Loaded Area". Their conditions are:

Nearest:
HasKeyword (the keyword we defined above) == 1.0

NextNearest:
HasKeyword (the keyword we defined above) == 1.0
IsAliasRef (Nearest) != 1.0

ThirdNearest:
HasKeyword (the keyword we defined above) == 1.0
IsAliasRef (Nearest) != 1.0
IsAliasRef (NextNearest) != 1.0

The quest loads these aliases into three properties, Near, Mid, and Far.

To use the custom courier, create a property for your script type on this quest and call one of the add functions, depending on whether you're using an alias or an objectreference or something else. You can change the courier type by setting up the Change courier function and you can switch containers if you want for a variety of different behaviors.

In the delivery scene, be sure to create an appropriate dialog topic, and have the scene itself transfer the objects with this fragment:

CourierScript.GiveItemsToPlayer()

(Edit): did some debugging on the "Change Container" and "Change Courier" functions, and added a random picking function for each, for shucks and grins.
User avatar
Andrea P
 
Posts: 3400
Joined: Mon Feb 12, 2007 7:45 am

Post » Wed Jun 20, 2012 3:39 pm

Pretty awesome! Thanks for this tut.
User avatar
jadie kell
 
Posts: 3497
Joined: Sat Jul 29, 2006 3:54 pm

Post » Wed Jun 20, 2012 9:27 am

Great work :) Please consider porting it to the wiki.
User avatar
Blackdrak
 
Posts: 3451
Joined: Thu May 17, 2007 11:40 pm

Post » Wed Jun 20, 2012 9:57 am

Thank you, http://www.gamesas.com/user/753342-redwood-elf/, I've bookmarked this page.
.
I'll be needing couriers as soon as I get into developing quests.
User avatar
Jacob Phillips
 
Posts: 3430
Joined: Tue Aug 14, 2007 9:46 am

Post » Wed Jun 20, 2012 11:33 am

Cheers for this redwood, i will be using it soon onece I'm finished level designing the areas in my mod.

I noticed that you have multiple variations of couriers. What I want to do is start off my quest with the player receiving a note but with one catch: if the player has completed the civil war quest on the side of the stormcloaks then I want it to be a stormcloak-themed letter with a courier in stormcloak attire but if they sided with the imperials (or not completed it yet/not even started it) then an imperial soldier delivers you an imperial-themed letter. Either way, the quest line will start the same, I just think it will make it fit into the skyrim world nicer of this is accomplished.

As you already know from helping me before, I am a beginner when it comes to the technical side of the CK, so any help with this will be greatly appreciated

- Hypno
User avatar
sally R
 
Posts: 3503
Joined: Mon Sep 25, 2006 10:34 pm

Post » Wed Jun 20, 2012 2:12 am

You would use the same procedure, but instead of using a spider or wolf or other critter like I did, you would take an "EncGuardImperial" type or an "EncGuardSons" type, strip off their AI behavior, and use them.
User avatar
Roy Harris
 
Posts: 3463
Joined: Tue Sep 11, 2007 8:58 pm

Post » Wed Jun 20, 2012 4:09 pm

I'll figure things out when it comes to it. im just finalising all the level building at the moment, i havnt even started on npc's yet. thanks again for the tutorial mate, it'll definitely come in handy eventually

- Hypno
User avatar
Jack Moves
 
Posts: 3367
Joined: Wed Jun 27, 2007 7:51 am

Post » Wed Jun 20, 2012 2:50 am

Thanks Redwood. Great post, and I'll echo ShadeMe and politely ask for a wiki version too :)

I still reckon there's a few more ready to bump this post to the top with more thanks yet though.
I was going to delay mine until it hit page 3 lol. I decided to add it to my watches. My browser bookmarks are a mess.
User avatar
Isaac Saetern
 
Posts: 3432
Joined: Mon Jun 25, 2007 6:46 pm

Post » Wed Jun 20, 2012 5:19 pm

Thanks Redwood. Great post, and I'll echo ShadeMe and politely ask for a wiki version too :smile:

I still reckon there's a few more ready to bump this post to the top with more thanks yet though.
I was going to delay mine until it hit page 3 lol. I decided to add it to my watches. My browser bookmarks are a mess.

If a volunteer will try implementing it and verify that I didn't miss any steps...I want to make absolutely sure the whole procedure is here and working before I try porting it into the wiki. It works on my machine, but I can't be 100% sure that I remembered to document every step.
User avatar
Heather Stewart
 
Posts: 3525
Joined: Thu Aug 10, 2006 11:04 pm

Post » Wed Jun 20, 2012 5:11 pm

You are awesome, thanks a lot redwood
User avatar
Ownie Zuliana
 
Posts: 3375
Joined: Thu Jun 15, 2006 4:31 am

Post » Wed Jun 20, 2012 2:57 am

What is the "hard to see object" (WICCDropPoint) used for? I don't see it mentioned in the tutorial or script after it's been created.
User avatar
Gavin boyce
 
Posts: 3436
Joined: Sat Jul 28, 2007 11:19 pm

Post » Wed Jun 20, 2012 5:31 am

What is the "hard to see object" (WICCDropPoint) used for? I don't see it mentioned in the tutorial or script after it's been created.

It's what I called a "bouncer" in the comments...it's just a small havok-affected object that you drop out of the sky in 3 different directions that are used as temporary potential courier spawn locations. The code picks the furthest one (after waiting 5 seconds for them to hit the ground) that actually settled and didn't fall through the world (Thus the check for a distance greater than 10,000 units) as the actual spawn point.

When making a custom object to use for this, I recommend putting a 'Death clock' type script on the object that makes it self delete after about a minute, since it only needs to exist long enough to find a point at ground level that is (hopefully) outside the players' direct line of sight at which to spawn the courier.

It's strictly so you don't need to place spawn points everywhere in the game.
User avatar
Undisclosed Desires
 
Posts: 3388
Joined: Fri Mar 02, 2007 4:10 pm

Post » Wed Jun 20, 2012 4:09 pm

Nice job, saves the rest of us from reversing the current courier quest!
User avatar
Eve(G)
 
Posts: 3546
Joined: Tue Oct 23, 2007 11:45 am

Post » Wed Jun 20, 2012 12:47 pm

Thanks for the response Redwood! And fantastic guide!
User avatar
phillip crookes
 
Posts: 3420
Joined: Wed Jun 27, 2007 1:39 pm

Post » Wed Jun 20, 2012 5:12 pm

Okay, I got a little further in the tutorial... and I've got a lot of questions:
  • The quest stages section refers to a CourierScript... is that the WICustomCourierScript (ie kmyQuest)?
  • Could you please elaborate on adding the Delivery scene? Just spell it out a bit more with a simple example?
  • The very next step addresses adding WICustomCourierScript which wouldn't compile because it doesn't know what CourierSpawnPointScript... is that the loader quest?
  • I'm totally confused by the Loader Quest. Almost none of that section made sense to me. Is the quest called ReloadOptionals? How do you specify which xMarkerActivator is the nearest? I'm lost.
User avatar
matt
 
Posts: 3267
Joined: Wed May 30, 2007 10:17 am

Post » Wed Jun 20, 2012 2:25 pm

Okay, I got a little further in the tutorial... and I've got a lot of questions:
  • The quest stages section refers to a CourierScript... is that the WICustomCourierScript (ie kmyQuest)?
  • Could you please elaborate on adding the Delivery scene? Just spell it out a bit more with a simple example?
  • The very next step addresses adding WICustomCourierScript which wouldn't compile because it doesn't know what CourierSpawnPointScript... is that the loader quest?
  • I'm totally confused by the Loader Quest. Almost none of that section made sense to me. Is the quest called ReloadOptionals? How do you specify which xMarkerActivator is the nearest? I'm lost.

The order is defined by the conditions...the "Nearest" just takes the closest one that has the predefined keyword. The next-nearest takes the closest one that has the keyword but is NOT the one in the "Nearest" alias, and the Farthest one takes the nearest one that has the keyword and is not in either of the other two aliases.

The courier script is the long one I posted, and can, indeed, be loaded into the KmyQuest variable. I was using an explicit property defined in my fragment script after the fragments, but KmyQuest would be the more usual way of doing it.

Making scenes is an entirely different tutorial, but http://www.youtube.com/watch?v=Qfcet5hf5bs that involves a scene (and also shows how the "Near, Medium, and Far" aliases work with a pair of barstools)

I added the loader quest script to the loader quest section for your perusal.
User avatar
Tammie Flint
 
Posts: 3336
Joined: Mon Aug 14, 2006 12:12 am

Post » Wed Jun 20, 2012 9:34 am

@Redwood

Would there be a way to change this to use a FormList of several NPCs what could play as Courier?

edit

I missed this part "Put an instance of each of your stripped down NPCs in it, and set them all to "Starts Disabled".

sorry :/
User avatar
Justin Bywater
 
Posts: 3264
Joined: Tue Sep 11, 2007 10:44 pm

Post » Wed Jun 20, 2012 4:42 am

Thanks a ton for putting this together and sharing. Thankfully I've at least gotten all my scripts to compile. Being a novice, I am a little confused by this last bit:


To use the custom courier, create a property for your script type on this quest and call one of the add functions, depending on whether you're using an alias or an objectreference or something else.

How would one go about doing these things? I am using an alias.
User avatar
Talitha Kukk
 
Posts: 3477
Joined: Sun Oct 08, 2006 1:14 am


Return to V - Skyrim