Jump to content

DOWNLOAD MODS

Are you looking for something shiny for your load order? We have many exclusive mods and resources you won't find anywhere else. Start your search now...

LEARN MODDING

Ready to try your hand at making your own mod creations? Visit the Enclave, the original ES/FO modding school, and learn the tricks of the trade from veteran modders...

JOIN THE ALLIANCE

Membership is free and registering unlocks image galleries, project hosting, live chat, unlimited downloads, & more...

Script Requests


Tonycubed2
 Share

Recommended Posts

Hello! Thank you to everyone who posts on forums like these - they're very helpful to newbie modders like me.

 

Anyways, I'm having trouble wrapping my head around Papyrus, so I thought might see if more experienced script writers (i.e. every script writer) thought my idea was even possible, or had approaches to suggest. I'm not looking for a complete script, just some input and direction.

 

The idea is to transform a dungeon into a player home. The dungeon is a safe cell - it doesn't respawn - after the associated quest is completed. The idea would be to add a tiny mini-quest triggered by finding an item after defeating the boss of the original quest. Complete the mini-quest, and the dungeon would be transformed.

 

I'm not overly worried about the adding an item or the mini-quest (there seem to be lots of tutorials on how do these things), but I am concerned about transforming the dungeon. My guess is that making conditional changes directly to the original dungeon would be labor intensive and messy and full of potential bugs. So, right now, I'm thinking of simply creating a copy of the dungeon. When the player completes the mini-quest, the original dungeon cell is replaced by the copied dungeon cell.

 

I'm concerned that there might be unforseen problems with this - at the very least, the player risks losing items or followers left behind in the original dungeon.

 

If the copy-and-replace approach is sound enough, I have two ideas of how to implement it. One would be simply switch the entry door - on completion of the mini-quest, the door would switch its linked reference from the original dungeon to the copied dungeon. It seems simple enough, but preliminary internet searches indicate it may not be possible with Papyrus.

 

The second idea would be to create a (initially disabled) replacement door linked to the copied dungeon. Upon completion of the mini-quest, the original door (leading to the original dugeon) would be disabled and disappear, and the replacement door would be enabled.

 

Anyone have any thoughts? Thanks again! :)

  • Upvote 1
Link to comment
Share on other sites

The second idea is much cleaner and much easier to handle.

I would stick to this idea in this situation.

 

If you become an advanced modder, the first idea would be no problem.

You would have to weigh pros and cons.

It takes alot of time to duplicate and re decorate, link items to be enabled/disabled/purchased.

You have to re do dialogue if any with NPC types that came with the dungeon, or at least study

them to verify you are not stepping on something and messing it up.

 

Personally, taking time to do the copy is more rewarding because if you

make mistakes, they are YOUR mistakes.  You do not have to back track

or cross reference another person's work.  You don't have to guess what

the modder intended.  Also if a command looks like it yields a certain result,

a newbie might read it wrong and make more compounded mistakes.

 

So, KISS method works better.  Keep it simple.  Learn it as much as you can.

Own your mistakes.  Do the second idea.

Edited by Ashenfire
  • Upvote 2
Link to comment
Share on other sites

Thanks for the reply, Ashenfire.

 

After a long, hard day of tutorials and experimenting (this stuff is not easy), I have a simple proof-of-concept test quest running. I can now successfully add an object to a container at a certain stage of a vanilla quest, use that object to trigger a new quest, and make the enable/disable swap out of two nearly identical objects based on the completion of the new quest. I'm really excited.

 

Now I just have to do it for realsies. :)

Link to comment
Share on other sites

The second idea would be to create a (initially disabled) replacement door linked to the copied dungeon.

 

The second idea is much cleaner and much easier to handle.

Hmmm. New problem. The dungeon I wanted to copy is actually a world space, not an interior space, so I can't simply duplicate it (the internet indicates it might be possible using TES5Edit, but that requires an understanding of FormID and hex I do not have). And my copy-and-paste-into-new-space attempt yesterday was frustrating and not very productive.

 

So. Theorectically. How would one go about tying a bunch of changes to the completion of a quest? Having things individually disabled/enabled by the quest completion seems like an overly ... complicated/tediouos/inefficient way of doing it. There must be a way to link all those changes to a single property/trigger/something that is in turn linked to the quest completion. I wish I knew how the Hearthfires build-your-own-house set up scripting worked. It might be give me an idea.

 

Or maybe... if all the enables/disables went into a independent script, and a papyrus fragment attached to the completion stage of the quest activated that independent script. But would each object enabled/disabled need to be defined as property in the independent script? That would be a lot of properties. Oi. Giving myself a headache.

 

How do you have a fragment start another, idependent script? I tried this tutorial, which included instructions on using a fragment to call a function out of a different script, but I could never get the *@#$ thing to work. So much to learn. And papyrus is so persnickety about little things. Sigh.

 

If anyone has any more suggestions, they would be greatly appreciated. Thank you all!

 

 

Edit: Oh! Browsing the forum, I just found out xmarkers are a thing! This seems like a likely answer to my question. Researching now ...

Edited by glenchild
Link to comment
Share on other sites

Like this:
 

;BEGIN FRAGMENT CODE - Do not edit anything between this and the end comment
;NEXT FRAGMENT INDEX 2
Scriptname JACM_PF_JacMorteHorsePlayerFo_02034178 Extends Package Hidden

;BEGIN FRAGMENT Fragment_0
Function Fragment_0(Actor akActor)
;BEGIN CODE
JacMorteScript.MountFollower()
;END CODE
EndFunction
;END FRAGMENT

JacMorteDialogQuestScript Property JacMorteScript Auto <-this is set to the quest that holds the script so Papyrus can find it in the properties tab.

JacMorteScript has a function called MountFollower() that I call from a script fragment attached to a package that runs whenever the player is mounted. The function looks like this:
 

Function MountFollower()    
    ;Debug.Notification("Morte is mounting.")

    if FollowerRef.IsHostileToActor(PlayerRef)
        Debug.Notification("Morte is hostile.")  
        Return
    endif        
    
    HorseRef.DisableNoWait(True)
    float angleZ = FollowerRef.GetAngleZ() - 90
    HorseRef.SetAngle(0, 0, angleZ + 180)
    HorseRef.SetRestrained(True)
    HorseRef.MoveTo(FollowerRef)
    HorseRef.EnableNoWait(True) 
    HorseSummon.Play(HorseRef)
    HorseRef.AddToFaction(FollowerFaction)
    HorseRef.SetFactionOwner(FollowerFaction) 
    angleZ = HorseRef.GetAngleZ() - 90
    FollowerRef.SetAngle(0, 0, angleZ + 180)
    FollowerRef.MoveTo(HorseRef, 60 * Math.Sin(angleZ), 60 * Math.Cos(angleZ), 0, false)
    FollowerRef.Activate(HorseRef, true) 
    Utility.Wait(1.0)
    HorseRef.SetRestrained(false)
    HorseRef.EvaluatePackage()
    RegisterForSingleUpdate(10.0)
    
EndFunction

To call functions from other scripts, you must spell everything consistently. If you don't want to mess around with properties, or are calling this from a function in a script that's not a fragment, you would use this format:
 

(JacMorteDialogQuest as JacMorteFollowerScript).DismissFollower()

Where JacMorteDialogQuest is the quest that JacMorteFollowerScript is attached to.

  • Upvote 1
Link to comment
Share on other sites

I learned how to disable / enable via:

1.  Dialogue.

2. A lever.

3. A trigger.

 

Xmarkers rock and you can use them to tie whatever you need to them and in the aforementioned types;

it will disable the xmarker and the xmarker will take take the rest off line via LINK REFERENCE and

ENABLE PARENT.

 

This is how purchasing a home, does it.

  • Upvote 1
Link to comment
Share on other sites

@glenchild
Also, remember, you might have done the tutorial correctly, however your

aliases might not have 'fired up'.

 

The only SURE method I have had with aliases, is to NEVER use the 'start quest enabled'

feature inside the kit.  I learned the hard way and lost a years worth of work.

The SEQ so called 'fix' is silly and does not always work.  Plus you have to

spend extra time 'baby sitting' changes you make with SEQ.  It is completely

not necessary.

 

I use the Story Manager and it has NEVER failed.    Just a thought.

  • Upvote 1
Link to comment
Share on other sites

@Ashenfire

 

I'll have to look into Story Manager. The Creation Kit tutorials barely touched on its existence, so I'll have to see if someone else explains it more thoroughly.

I was under the impression Story Manager was for radiant quests, whereas I need a static quest that would be triggered by finding an object or through a piece of dialogue. And I had another idea for a different mod kicking around in my head - and it would definitely need to be enabled as soon as the game started up. Are those possible with Story Manager? i would watch some tutorial videos, but it is a lot harder to hide youtube video-watching at work than it is forum-posting. :sweat:

 

Thanks for the input!

Link to comment
Share on other sites

<snip>

 would definitely need to be enabled as soon as the game started up. Are those possible with Story Manager?

 

 

 

:cool:

You are in luck! They can be enabled right away!

I wrote a 'pre' howto on Story Manager.  Let me see if it is available.

Basically, it is not limited to what you were saying, there is much more

usage for it. 

Example:

  I am writing a mod with multiple stories.

  I wanted the beginners merchant quest to begin immediately.

  This would allow the player to be curious who they are and ask

   questions that would lead various plots in the story.

I told story manager to activate the  merchant quest when the

player traveled to the location where the story starts.

No sense in enabling it until the user gets to the area where

the merchants are actually giving the quest.

You can broaden that and enable on demand via story

telling, changing cells, etc.

Link to comment
Share on other sites

I found it, it is a rough draft.

 

I will go ahead and make it a priority to make it usable.

It is usable in its current state, however it holds your hand

and tells you where to click, etc.   It is in order and is finished.

 

It also does not have highlights or other easy means to make it

friendly to the eyes.  So you can wait or I can give you the

rough draft and hope that I finish the final copy in a timely

fashion. :pc:

Edited by Ashenfire
  • Upvote 1
Link to comment
Share on other sites

I found it, it is a rough draft.

...

It also does not have highlights or other easy means to make it

friendly to the eyes.  So you can wait or I can give you the

rough draft and hope that I finish the final copy in a timely

fashion. :pc:

 

 

Ooh! Really? I don't need anything pretty, if you're willing to share a rough draft, that would be great. The most frustrating thing about learning this is knowing something is theoretically possible but not quite knowing the mechanics of making it work. Advice/examples/tutorials/walk-throughs/what-have-you from other scripters are super useful!

 

Also, you are awesome for being helpful. Just thought I'd tell you.

Link to comment
Share on other sites

Aww,  thanks.  I am lucky that after having a terrible year, that I am still interested in story telling and making it come true.

 

My rough draft tells not just about story manager, but an entire character creation, how to make the NPC interact, give items,

talk to others, etc. 

 

I am in the process right now to re do it step by step and have it only focus on story manager.

 

I can email the rough draft.   It is in html coding since I meant to use it as part of my "Skybrary" and post it on my website.

So you can view it with your browser for now. 

I am trying to build a professional website and stay allied with TESA, this means I really am trying and will not lead anyone

on or lead them to frustration.  If I do, its because I'm an airhead but it won't be intentional.

 

So if you are afraid to read my web page then I will put it in this spoiler and you can see for yourself.

If you trust it, then just 'copy' and then paste it into a new.txt file and rename '.txt'  to '.html'

 

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

<meta name="description" content="TESA Tutorials" />
<meta name="keywords" content="HowTo, Story Manager, SM, Enable Quest, Change Location, Ashenfire, Thirteen Oranges" />
<meta name="robots" content="index, follow">
<meta name="revisit-after" content="3 month">
<title>     </title>
<!-- Comments about the site
TESA community has education, tutorials on mods.
Join them tesaalliance.org
-->

<html lang="en">

<head>
<title>How To Enable A Quest Via Story</title>
<style type="text/css">
    body  {
        font: 100% Verdana, Arial, Helvetica, sans-serif;
        background: #ffffff;
        margin: 0;
        padding: 0;
        text-align: center;
        color: #000000;
    }
    #container{width:100%; height:20px; text-align:left;}
    #header{position:relative; width:100%; height:100px; background-color:#EFEEEE;}
    #left{position:relative; width:170px; height:100%; float:left; background-color:#EEEEEE;}
    #left1{position:relative; width:170px; height:100%; float:left; background-color:#EEEEEE;}
    #mid{position:relative; width:170px; height:100%; float: left; background-color:#EEEEEE;}
    #mid1{position:relative; width:170px; height:100%; float:left; background-color:#EEEEEE;}
    #mid2{position:relative; width:170px; height:100%; float:left; background-color:#EEEEEE;}
    #right{position:relative; width:170px; height:100%; float:left; background-color:#EEEEEE;}
    #main{position:relative; width:600px; height:100%; background-color:#FFFFEF; float:left; padding:10px;}
    
</style>
</head>



<body>
    <div id="container">
        <!-- header part of the document -->
        <div id="top">
            <pre><h1>                      Story Manager Creation</h1></pre>
        </div>
        <!-- end of #top -->
        <!-- left part of the document -->
        <div id="left">

        </div>
        <!-- end of #left -->
        <!-- main part of the document -->
        
        
        
        <div id="left1">

        </div>
        
        <div id="mid">
                </div>
        
        <div id="mid1">
                </div>
        <div id="mid2">
                </div>
                
        <div id="right">
                </div>
        
 
        
        <div id="main">
            <p>
<pre>
I am writing a quest with many quests in it, called Angie's Neighbor.

I tried for 4 months to get broken dialogue to work and was not successful.  It broke after patch update.
Generating SEQ files did not help.

So the purpose of this tutorial is still useful because no matter what method you use to start quests,they
have to use the dialogue scenes.  It works once activated with story manager.

Due to much blood, sweat and tears, Oh...I DO mean tears........
I will show you the beginning steps to get Angi, her neighbor and the player to interact with each other.
They will talk, exchange inventory items, read a journal, get mad at each other.
The rest of the story will be left out since it is under construction.

                  Let the drama begin!

I.  Create your house, town, characters that will interact with you or the world space.

     For the purpose of this tutorial we will create NPC named Grim Feather the Fairshot and place a marker at
      world space Angiscampexterior -7,-25

      We won't give her items or make her special because that goes beyond the purpose of the tutorial.
   A.  In the Object window, click on ACTORS, expand it.   Click on ACTOR below the ACTORS option.
       Right click on any of the npcs you recognize and 'duplicate'
       Right click and edit your duplicate.  
              Change the ID to ANAngiesHirelingAssistant
              Change the Name to Grim Feather The Fair Shot, Short name Grimsy
              Change RACE to darkelfrace,    Female box checked,     Voice type femaile dark elf.  disposition 75
              click UNIQUE on left side, only box that is checked.  
        CLOSE-press OK
       You will be asked to duplicate it again, tell it NO.  This is already a duplicate that was renamed.






II    .  Place a marker where Angi lives.  Place it away from the stairs and away from her house.

        Lets find where she lives.
         Click on cell view window, click on World Space drop down and choose Tamriel.
         Type coordinates -7, -26 or look for EditorID called AngisCampExterior.

        OBJECT WINDOW:

      1. Click on ACTORS, type in the filter:       mapmarker
         Click on *ALL          *Try not to type in the filter box when *All is selected, it will search for every character you  
                             type(very long wait)

         On the right is Editor ID column and under that column is MapMarker. Drag it to the angis camp exterior away from
          the stairs and away from the house.

         Double click on the map marker and click on the marker data tab.
         Make sure the box is checked for Marker Data.
         Give it a name Angies Forbidden Abode (Which is the name that will appear when users is looking on the map).
            You can name it something else if you want.  Just remember what you called it.
         Give it a type called landmark
 
                             *note:  next step is only required if you actually created your own xmarkerheading and dropped it into the cell.
                              Open map marker and click on linked ref tab and double click on the white space and select the  xmarker you created.

      2.   Using xmarker.  It is not necessary to use one unless you want the character to spawn at a location that is not at the map marker 'M'.
           *all  search filter  xmarker              
           drag xmarkerheading to the world space (angiscampexterior)
          Open map marker and click on linked ref tab and double click on the white space and select the xmarkerheader you created.
           
        

III.  Quest Dialogue
 
   Object window:                 Click on CHARACTER (very often used, so remember it).       Click on QUEST

  *NOTE
    Dialogue window: will have symbols under the TARGET column. this determines who or what will be examined or have the conditions run on
them.  The default is:  Subject, which is usually who you are talking to or interacting with when you are the NPC in dialogue or activating ACTORS.

         Subject        Target [T]   Reference [R]   Combat Target [C]  Linked Reference [L]   Quest Alias [A]
    Package Data [P]   Event Data [E]      Player [PL]


   You will see many yellow items with ? symbol next to them. On the right you will see NAME column. Your quest name will
   show here once you create it.
   So for now right click on any of them and click "NEW".

=========================================================================================================
QUEST DATA tab
=========================================================================================================

   A pop up will ask you to name the Quest in the Quest name box.  (later, it shows in the name column mentioned above).
       follow same syntax, this will make debugging easier.
   IDsyntax:  nameofquestgsq    (might I suggest that you always use GSQ for 'general starting quest' if this is first quest?)
      So lets make a quest called 'Angies Neighbor'  sub titled Perturbed Angie.

   Go ahead and fill these in for your new pop Quest Data tab.
     
     ID: ANGSQ                                                            TYPE: side quest
           It stands for (AngiesNeighborGeneralStartQuest)

      Quest Name      Perturbed Angie

      Priority   50       


Right click on the white space in the 'quest dialogue conditions' and click NEW.

Click on the drop down menu called 'CONDITION FUNCTION' and choose GetInCurrentLoc.
Click on the INVALID button and choose a place in skyrim like Whiterun or if you made your alias, choose it now.
     Comparison will be '==' and   Value will be '1'.  
Run it on SUBJECT.  
Press OK

If you created Angis Place as your alias it will look like this:



Quest Dialogue conditions

Target              Function Name               Function Info                        COMP:             Value              operand

S (subject)           GetInCurrentLocAlias     Alias: Angis Place                     ==                 1                   and
                                                        ^===This has to be created in the Quest Alias tab.


=================================================================================================================
Quest Stages tab
=================================================================================================================


right click index  give it value of 0.  Do it again and make the value 1

The standard is to give it increments of 10 or so, that way you can make changes.  Very much like old school programming gwbasic.

We don't care, since this is just a starting tutorial

1. Click on index 0
   Click on box 'start up stage'
   right click on white space and click 'new'.  This creates new journal entry
   At the bottom of the page double click on the white area under CONDITIONS:
   choose the condition GetInCurrentLocAngisCampLocation == 1.  Advanced users will use the Alias.
   Leave the log entry empty since it is the first stage.
2. type SetObjectiveDisplayed(0) into the papyrus fragment box and compile.

3. Click on Index and click on '1'
Create a log entry like you did above.
Type something in the Log entry like "Angi is scared or test test test" doesnt matter....
Set the conditions by right clicking the Log entry at the top
Then right click the CONDITIONS area at the bottom, click new.   Choose GetStageANGSQ<=1

in the papyrus type setObjectiveDisplayed(1)



At this point either Grim Feather gives quest via dialogue or it is generated by a trigger you create and place somewhere
at Angis place
========================================================================================================
Quest Objectives tab
=====================================================================================================
click on objective index 0
  In Display text, type whatever you want (its only for testing ).           I used:    Find the balance at Angis Place


Below that is Target ref, I used Perturbed Angi which is an alias.


click on objective index 1

type whatever you want in display text.                      I used Meet Angi, look for clues.           Same target ref


==========================================================================================
Quest Aliases
=====================================================================================


CREATE 3 items listed below as aliases

Alias name                          type                    fill type                                              flag         


Angis Place                       loc                      Forced:AngisCampLocation                               
Perturbed Angi                    ref                       UniqueActor'dunAngiRef'                                E
Grim Feather the Fair Shot        ref                       UniqueActor 'AnAngiesHirelingAssistant'                E

==========================================================================================================
Dialogue Views
=========================================================================================================

This is the most cumbersome part of quest making. Understanding scripts and dialogue branches.
I have a program called clip mate.  I came up with a production standard for any quest I make and then
I copy every single line from clipmate into the dialogue boxes so I can re create at any time.

I  identified the branches by the first 2 to 4 letters of the name of the Mainquest+current quest name+function or action of the quest.

For instance:  Branch ANGSQareyoumad

So you would right click Editor Id field that is under Dialog Views and click new
Type ANGSQAreYouMad as the new branch name

it will add 'topic' to the end of it in the ID field:  ANGSQAreYouMadtopic
you will have the Topic Text are you mad?

Press ok


You now have a topic INFO window where you can put responses text
You can  type   'testing this branch are you mad'.  This is where the ACTOR would say something to you.

*remember    TOPIC text field (in this case its 'are you mad' ) is coming from YOU.  You are
             asking this question so the ACTOR can REPLY to it.



Check mark has lip file and Force Subtitle (if you don't have voice actors).
Conditions:

S    GetIsAliasRef      Alias:Perturbed angi == 1    or
S   GetIsId             Actor:'DunAngiREF'   ==1     or

This will make Angi say the text you put in the reply above.  No voice so the text will be shown.
This is the most cumbersome part of quest making. Understanding scripts and dialogue branches.
I have a program called clip mate.  I came up with a production standard for any quest I make and then
I copy every single line from clipmate into the dialogue boxes so I can re create at any time.

They are identified by the first 2 to 4 letters of the name of the Mainquest+quest name+function of quest

For instance:  Branch ANGSQareyoumad

So you would right click Editor Id field that is under Dialog Views and click new
Type ANGSQAreYouMad as the new branch name

it will add 'topic' to the end of it in the ID field  ANGSQAreYouMadtopic
you will have the Topic Text are you mad?

Press ok


You now have a topic INFO window where you can put responses text
You can  type   'testing this branch are you mad'.  This is where the ACTOR would say something to you.

*remember    TOPIC text field (in this case its 'are you mad' ) is coming from YOU.  You are
             asking this question so the ACTOR can REPLY to it.


=============================================================================================
Story Manager
=========================================================================================

   Quests can start from dialogue and using the 'start game enabled' check box, but since after patch updates, dialogue
   breaks.    To avoid that, use the story manager.
   It must know the location where the events start and take place.
   It also helps control memory consumption by not starting quest until its time.

Once a quest or dialogue is started, it throws all its knowledge into the story manager.
The story manager will take the variables, conditions, etc and see if they 'stick' to a particular alias or quest condition.

Story manager acts just like static and random options you see when you are creating a package for npcs.

This means it will provide 'priorities' based on the quest, they usually start at 50 as the priority.
They are helpful if you have many quests running at the same time and need an event to happen on quest 2
before other quests.  I try not to prioritize very often, but it is necessary sometimes.

Objective:  Tell the Story Manager (SM) where the event is, so it will activate the quest.

CREATION KIT:              As an EXAMPLE:
   OBJECT WINDOW:
        Click on WorldData, filter: tamriel

  Find the CHARACTER listing and expand the tree.

     * Try not to modify existing nodes or create a new event node. That will likely break it or cause havoc.
 
For now, STAY WITH THE CHANGE LOCATION EVENT NODE
So double click on it and you will see Stacked Event Node: Change Location Event.


1. Expand the node.
2. Right Click on the Stacked Event Node: Change Event Location
3. Click 'new branch node'. It will most likely start at the bottom of the list of nodes
4. Click on the new branch you created.
5. In the Node Properties grey box below, put the name of your main quest in the ID text area, or something
   generic like 'questtodolist(your name)'.  If you follow standards you set up, you can find your modifications
   with your quest labels or your name label very quickly.
      *I used AngiesNeighbor
   
6. Right Click on the node you created and click on add quest, a drop down of the quests that are in the game will show.
   Also, you should have already created the basics of your quest by using the DIALOGUE step.  This is where quests are
   named and given stages for the quest.

7.  Keep in mind on your quest nodes, you will most likely use the shares event box.  Nothing else to check mark  is  
    necessary.  ALSO note:  if you do not share events, then the events BELOW your node can break!  So either share or make
    your node last on the list.

8.  In the Quest Branch (the second one that you created and is sharing the event, there is a funcion or CONDITION
    that you set.  In the white space, right click 'new'  and choose GetInCurrentLoc as the function and S=the target
     and as my example AngisCampLocation is the function info.



You should now be able to see a new Objective message when you fast travel to Angis Camp.  Where she teaches archery.

              </p>

        </div>
               </pre>
        <!-- end of #main -->
    </div>
    <!-- end of #container -->
</body>








</html>

  • Upvote 1
Link to comment
Share on other sites

I just created a tutorial that is waiting for approval.

 

I believe it cuts to the chase and will help you with your quest.

It assumes you created your own quest, created your own EXTERIOR location.

 

 

here is the unofficial guide to make the Story Manager activate your quest, using an Event-Change Location.

Quest Creation Using Story Manager

 

Introduction

If you want to learn how to use the story manager to activate your quest, then you will want to use this friendly approach.  No extra video to get in the way. 

Learn how to use Story Manager in 15 minutes or less.

 

What You Need

  1. Creation kit {download from steam}
  2. A mod that you created.
  3. A quest that you created, does not require dialogue or stages.

What Modder Level Can Use This

  • Beginner
  • Mid level

Five Basic Steps To Quest Design

  1. A Location for the quest to take place.
  2. Actor or NPC that will be in the location to do the quest.
  3. The Quest that is created from the object window.
  4. Placing a map marker on the exterior location to make it available for fast travel.
  5. Story Manager

 

How To Use Story Manager

 

We will focus on step 5.  We will use the story manager event node.

These names do not scare us because we just need to do the basics.

We will focus on Change Location Event.

 

I.  General Preparation

 

  1. Start your Creation Kit.
  2. Load your mod.
  3. Activate your mod.
  4. Click on Cell View window.
  5. Verify you are using EXTERIOR location.
  6. Verify your cell is selected

 

  Click on World Space Drop Down and select Tamriel.

  To open your cell by using WORLD SPACE EditorID:

  Use Object window.

  Click on 'FormID' to re order the list of available cells.

  Click on 'FormId' again which will bring YOUR creation to the top of the list.

  This is for EXTERIOR view.

            

 

II. Quest Preparation

  1. Open your Quest
  2. Click on Quest Data
  3. Choose any priority if you need to.  Status quo is around 50.
  4. Verify NO check marks are in 'Start Game Enabled'
  5. Click on 'Event' drop down
  6. Click on 'Change Location Event'
  7. Click on 'Quest Stages'
  8. Verify that there is one 'index' with a number in it.
  9. Click on the first index.  Most likely '100'   or  '0'
  10. Click on check box 'start up stage' to put a check mark in the box.
  11. Right Click on the white space under 'log entry' located to the right and create a 'new' log entry if it has not been done yet.
  12. Its up to you to leave the log entry contents empty or not. Click on the new log entry bar.
  13. Click on Papyrus Fragment Box and verify first objective is displayed.
  14. If it is not, type SetObjectiveDisplayed(0) into the fragment box.  Replace the number zero, with the objective number you created.
  15. Click on Quest Objectives.
  16. Verify there is at least ONE line of text in the objective, this helps verify the quest is active. If not, create one (right click white space). Click New.
  17. Close the Quest Manager.

 

III.  Story Manager

  1. Click on 'Object Window'
  2. Double Click on 'Character'
  3. Click on 'SM Event Node'
  4. Double Click on 'Change Location Event'
  5. Double Click on 'Stacked Branch Node: QuestNode'
  6. Right Click on this node and select 'New Quest Node'.
  7. Click on 'Stacked Quest Node' located at the bottom of the list.  It has an {*} asterisk next to it.
  8. Click on 'ID'in the Node Properties window at the bottom fo the SM Event Node Window.
  9. Fill in 'ID' field with just characters.  NO spaces.
  10. Click on check box 'Shares Event'
  11. Right Click on the stacked node that you just created in step 6.  It will most likely be at the bottom of the page with an asterisk.
  12. Click on 'Add Quest'.
  13. You will see a 'tree' listing with a new quest underneath the stacked node you created.  Labeled Quest:{nameofyourquest}
  14. Click on the quest you just created in the 'tree' listing.
  15. Right Click the white space on right side 'Node Conditions'
  16. Click 'NEW'
  17. Type 'getin' in the 'Condition Function Drop Down', it will change to the area that starts with those letters.
  18. Click on GetInCurrentLocation
  19. Click on the button to the right of Condition Function, to choose the exterior location that will start the quest.
  20. Type the first part of the quest name.  This was given, inside the Quest Manager.
  21. Click on your quest to choose it.
  22. Click on 'OK' to close the 'Condition Item'.
  23. Click on 'OK' to close the Story Manager Event Node Window.
  24. Save

 

 

TEST

  • Once you are in your game, press the 'tilde' key.  It looks like this {   ~   }
  • Type 'coc' then a space, then the name of the exterior cell location that the quest will start in.
  • You should see a new objective display.
  • Press 'J' for journal and look at your quest that are available.

 

 No need to do anything else.

 

 

 

 

 

 

 

 

 

Sources

 

 

 

 

  • Creationkit.com
  • Thirteen Oranges
  • Lots of my time observing, testing, failing, trying again.
  • TESA, for allowing me to post.

 

 

 

 

Edited by Ashenfire
  • Upvote 1
Link to comment
Share on other sites

  • 2 weeks later...

Hi all!

 

I have authored a mod that adds several types of new arrows and a bow to the game. 

I would like to make it so that when the Bow from my mod is being used the range and speed of the projectile is increased, so in essence Ide like to assign 2 projectiles to an ammunition type and have the type of bow used decide which projectile is fired. In my headcanon that would need a script that checks the player inventory for a specific Bow and Arrow equip combination and assigns the correct projectile type on the fly. Or if its possible, have the script edit the projectile speed and range values directly.

 

So in steps:

 

a. Is player equipped with Bow X

b. Is player equipped with Ammo Y

if a+b = yes, then use projectile Z 

 

or:

 

a. Is player equipped with Bow X

b. Is player equipped with Ammo Y

 

if a+b=yes then for Projectile Y;

Set range to X value

Set speed to X value

 

 

I know nothing about scriptwriting so I was hoping to draw on the experience of the community, Is the above feasable/possible?

 

Any input would be great.

 

Thankyou in advance!

Link to comment
Share on other sites

  • 2 weeks later...

I would like to request a mod that basically allows the 'storage' of dead bodies within scrolls for my Necromancer.

 

So, ideally it would go something like this - 

 

- Cast spell (similar to dead thrall) on desired corpse and it will add a scroll to your inventory with that 'body' in it.

-Use the scroll and it summons the dead body.

 

I thought I could figure it out in the creation kit, but it seems I am no scripter.

Link to comment
Share on other sites

  • 1 month later...

Hi,

 

I'm hoping to create an effect for my armour piece. Basically, I'd like to give the player 10% fire and frost resistance for every dragon soul they have.

(max 90% or something similar)

 

If I had 3 dragon souls, I'd have 30% resistance to both; if I used one soul, I'd have 20%. Thing is, I'm completely new to scripting and can't for the life of me figure out how to make the script.

 

And help is greatly appreciated.

Link to comment
Share on other sites

I feel so helpless, I like your ideas, all of you!  :toast:

:pc:  I am struggling to get scripting down.  I'm also afraid to commit more time if the rumors are true that

python will be abandoned for a new scripting system.  Even my story line is on hold until I figure these wretched scripts out. 

 

While I work on my story line I will experiment with your questions.  I will of course post the results.

Link to comment
Share on other sites

  • 4 weeks later...

Does anyone know a script or can make one that makes you able to summon a chest or forge using a spell?

 

A property would be the item you summon.

Thanks.

 

Edit i got it to work but it doesn't unsummon it... anyone knows how the to make the script unsummon the item after like 30 secs?

Edited by Icrusher
Link to comment
Share on other sites

  • 4 weeks later...

I need help with a script I'm working on. So far it works flawlessly except for two things.

 

It's a summon script that can only be used once per day, and summons three minions.

 

The problem is that once summoned, they are not under my control (like a regular summon spell) and attack me (like a wolf in the wild). I need help changing this so that they are allies. I've tried setting them to PlayerFaction, but that hasn't helped. I need to either enter a new line in the script that changes them to friendly once summoned, or alter the base actor in a way that I have so far missed.

 

The second problem is that I have not found a way to summon a copy of them, only the main trio. Because of this, any subsequent castings only summon corpses of their former selves. I need help finding a way to summon a copy of them (like summoning a Familiar or Atronach with a regular spell) instead of the base actor itself.

 

 

Edit: I fixed it. It works the way it is supposed to now. I had to rewrite the entire thing, but it works now.

Edited by VanScythe
Link to comment
Share on other sites

  • 3 months later...

Hello, I have been trying to find some help with a few scripts and  have posted in a few other places. While searching about scripts I found a link to this forum and Im hoping someone here can help me. I am trying to make a puzzle that uses a number of levers and a single button to create one puzzle with two possible solutions. Im trying to make the scripts so that almost any number of levers can be used. I am using two scripts, one on the button, and one on the lever. The scripts compile fine, and the lever/button function, but nothing happens other than the lever and button moving. I want it to disable and enable certain objects, but that part doesnt happen and I am not sure why. I havent really messed with scripting since morrowind so Im pretty rusty, but I do need this to work for a mod Im trying to make.

 

Lever Script

{
- User can use properties to set the levers initial state
- The script first checks to see if the initial state is the same as the solve state
- When the lever is activated, the lever rotates to a new position and then checks to see if its solved
- If lever is solved, the script increments neccessary vars in the sgleverPuzzlebutton.psc
- Each pillar needs to have its linkedRef point to the lever where the sgleverPuzzlebutton.psc lives
}

import debug
import utility
import game
import sound

bool leftNext = TRUE    ; this bool helps us remember which state to go to next
bool property startactive auto

SGdwepuztest01 myLinkedRef

int property solveState auto
{
This is the position the lever needs to be in to be considered solved.
1 = Position 1 (pulled)
2 = Position 2 (middle)
3 = Position 3 (pushed)
Position 1,2,3 refer to the havok animations
}

int property solveState2 auto
{
This is the position the pillar needs to be in to be considered solved.
1 = Position 1 (pulled)
2 = Position 2 (middle)
3 = Position 3 (pushed)
Position 1,2,3 refer to the havok animations
}


EVENT onLoad()
    playAnimation("MidPosition")
    if startActive == true
        wait(RandomFloat(0.25, 2))
        activate(getPlayer())
    endif
endEVENT

FUNCTION checkforsolve (int statenumber)
        if (SolveState == statenumber)
            ;trace(self + " Lever Solved!")
            myLinkedRef.numLeversSolved = myLinkedRef.numLeversSolved + 1
            if myLinkedRef.numLeversSolved2 == 0
                ;donothing
            elseif myLinkedRef.numLeversSolved2 >= 1
                myLinkedRef.numLeversSolved2 = myLinkedRef.numLeversSolved2 - 1
            endif
        elseif (SolveState2 == statenumber)
            ;trace(self + " Lever Solved!")
            myLinkedRef.numLeversSolved2 = myLinkedRef.numLeversSolved2 + 1
            if myLinkedRef.numLeversSolved == 0
                ;donothing
            elseif myLinkedRef.numLeversSolved >= 1
                myLinkedRef.numLeversSolved = myLinkedRef.numLeversSolved - 1
            endif
        endif
endFUNCTION

AUTO STATE OFFpos
    EVENT onActivate (objectReference triggerRef)
        gotoState ("busyState")
        trace("Switch Animating Down")
        if leftNEXT == true
            playAnimationandWait("pushDown","pushed")
            trace ("done animating")
            checkforsolve(3)
            gotoState ("busy")
            gotoState("LEFTpos")
            leftNEXT = false
        else
            playAnimationandWait("pullDown","pulled")
            trace ("done animating")
            checkforsolve(1)
            gotoState ("busy")
            gotoState("RIGHTpos")
            leftNEXT = true
        endif
    endEVENT
endSTATE

STATE LEFTpos
    EVENT onBeginState()
        utility.wait(0.4)
        trace("entering left state")
    endEVENT
    
    EVENT onActivate(objectReference triggerREF)
        gotoState("busyState")
        playAnimationandWait("pushUp","unPushed")
            checkforsolve(2)
;         debug.trace("start wait")
            gotoState ("busy")
        utility.wait(0.4)
;         debug.trace("end wait")
        gotoState("OFFpos")
    endEVENT
    
    EVENT onEndState()
;         debug.trace("play endstate stuff (left)")
        trace("exiting left state")
    endEVENT
endSTATE

STATE RIGHTpos
    EVENT onBeginState()
        utility.wait(0.4)
        trace("entering right state")
    endEVENT
    
    EVENT onActivate(objectReference triggerREF)
        gotoState("busyState")
        playAnimationandWait("pullUp","unPulled")
            checkforsolve(2)
            gotoState ("busy")
        utility.wait(0.4)
        gotoState("OFFpos")
    endEVENT
    
    EVENT onEndState()
        trace("exiting right state")
    endEVENT
endSTATE

 

 

 

Button Script

 


{
- This script lives on the button that controls each of the pillars
- Each lever should have its linkedRef point to the button that this script is on
}

import debug
import utility
sound property QSTAstrolabeButtonPressX auto
objectReference property objSelf auto hidden


int property levercount auto
{number of levers in puzzle}

int property numleversSolved auto hidden
{this counts how many levers are correct for first lever combo}

int property numleversSolved2 auto hidden
{this counts how many levers are correct for second lever combo}

bool property puzzlesolved1 auto hidden
{states if levers are in correct position for first combo}

bool property puzzlesolved2 auto hidden
{states if levers are in correct position for second combo}

bool property itemdisabled1 auto hidden

bool property itemdisabled2 auto hidden

ObjectReference property refEnableOnSuccess auto
{This ref is enabled on successfully solving the puzzle}
ObjectReference property refDisableonSuccess auto
{This ref is disabled on successfully solving the puzzle}
objectReference property refEnableOnSuccess2 auto
{This Ref is Enabled on successfully solving the second sequence}
objectReference property refDisableOnSuccess2 auto
{This Reference is Disabled on successfully solving the second sequence}




event onCellAttach()
    objSelf = self as objectReference
    playAnimation("Open")
endEvent

Function enableordisable()
    ;if the puzzle is solved, disable the refDisableonSuccess
    ;else if the puzzle is not solved, activate the refActOnFailures (the dart traps
    ;in the case of BleakFallsBarrow01)
    ;wait(6)
    if (numleversSolved == levercount)
        puzzleSolved1 = true
        puzzleSolved2 = false
        refEnableOnSuccess.enable()
        refDisableOnSuccess.disable()
        itemdisabled1 = true
        if itemdisabled2 == false
            ;do nothing
        elseif itemdisabled2 == true
            refDisableOnSuccess2.enable()
            refEnableOnSuccess2.disable()
            itemdisabled2 = false
        endif
    else
        puzzleSolved1 = false
    endif
endFunction


auto state open
    event onActivate(objectReference akActivator)
        goToState("waiting")
        playAnimationAndWait("Trigger01","done")
        if QSTAstrolabeButtonPressX
            QSTAstrolabeButtonPressX.play(objSelf)
        endif
        goToState("Open")
        enableordisable()
    endEvent
endState

state waiting
endState

 

Link to comment
Share on other sites

I'm pretty new to scripting, and while I understand simpler stuff if I see it in a video and have it explained to me, what I want to do isn't exactly covered by any one tutorial, and combining parts of different scripts is, understandably, not working too well. I've been looking at the resources provided by the CK official site, as well as some of the tutorials here.

 

What I'm trying to do is set up a house that appears to be full of cobwebs and junk the first time a player enters it, and they can then interact with a few things to clean the place up, e.g., interact with a broom to clear all cobwebs from the house. Ideally I'd like for there to be a brief fadeout and a short passage of time, perhaps an hour or so. I know how to link the things I want enabled or disabled to an XMarker, and I know how to link the XMarker to something else (like an activator or triggerbox), but I can't quite get the other parts. From what I can tell, using stages would probably be the best way to implement this, but I'd also want it to be a one-off event. For example, interacting with the broom would fade out, pop up a "You cleared all the cobwebs from the house" message, bump the time ahead one hour, and then on fading back in, disable all the cobwebs via the XMarker and also remove the broom activator. I managed to weatherproof outside areas on the house just fine, but this is over my head.  :wacko: Any help will be immensely appreciated.

Link to comment
Share on other sites

  • 3 weeks later...

Is it possible to use this fragment to add a Note to the player's inventory that starts (for instance) a Needs mod which doesn't need configuring at the MCM or anything, but just runs?


int doOnce

EVENT onActivate(objectReference akActionRef)
	If ( akActionRef == Game.GetPlayer() && doOnce == 0 )
		Button = question.show()
		if Button == 0
			Yes.show()
			doOnce = 1
			Game.GetPlayer().AddItem(Gold001, 1000, true)
		elseif Button == 1
			No.show()
		endif
	EndIf
endEVENT
Edited by Allannaa
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...