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...

Vain

Allies
  • Posts

    157
  • Joined

  • Last visited

  • Days Won

    4

Posts posted by Vain

  1. Hi guys,

     

    Im trying to create a Fire claw which is a fire elemental werewolf with a base height increase of +.3 in the creation kit. im also going to retexture the wolf to have active flames going down its back and around its face. the script i need should be simple for any experienced scriptwriter (im new to skyrim's scripting). it is a script for the melee damage to also inflict fire damage of 15 points (Ill figure out how to change the values). And have a lasting burn duration of 20 seconds. 

    in second to that i need a script that will allow the fire claw to breath fire whether in shout form or in actual dragon breath form (dragon breath is preferred but ill take anything).

    thanks and let me know if i left anything out. :devil:

    I might be able to help with this - check out this thread - Overhauling Werewolf Scripts/Quest It probably wouldn't be scripting so much as modifying the Claw Damage ability of a Werewolf... Werewolf Shouts would be part of scripting.
  2. I could help more if you had the entire script.

    Basically you'd wanna see everywhere CaptainA-C appear in the script and pick one, let's say CaptainA, and duplicate all the functions involving that only instead of CaptainA it'd be MyCaptain or however you wanna call it.

     

    You'd also probably have to add him to the FortRandomQuest the same as the original Captains somehow.

  3. I suck at this but let's combine our suckiness.

    Lesse...

     

    So you want a script to make the container only accept a certain item - there may already be a functionality in the game for that.  Like Armor Mannequins only accept Armor, Jewelry, and I think Shields but are still considered containers.

    As for put Item A into Box A and have Box B create Item B... can you tell me exactly what you're doing with that?

    Or is it more like Item A into Box A makes Item A disappear form Box A and appear in Box B.

  4. Modding Workshop: My First Quest

     

    Dragonborn_Knotwork.png.3d1ae7df03d90b97a7285e4a3a310e8b.png

     

     

    Welcome to the Modding Workshop: My First Quest. In this tutorial we will be discussing how to create a lore-friendly quest using existing NPC's and recorded dialogue and how to package it properly for upload. We will briefly discuss item creation, triggers, and scripting, but this workshop will not cover every aspect of these topics, only what is needed for this task. Coming into this tutorial, you should already be familiar with the basics of navigating the Creation Kit and some knowledge of Papyrus syntax.
     
    Part I: Tools
     
    You're going to need several tools for this job in addition to the Creation Kit.
     
    BAE - Allows you to view the contents and extract from Skyrim BSA and ESM files.
    Voice File Reference Tool - Allows you to view and search the voice files from Skyrim without needing to extract them and shows file name, dialogue, and voice type.
    Unfuzer CPP Edition - Allows you to decompress FUZ files from Skyrim to WAV and LIP and compress WAV and LIP files to FUZ.
    Wrye Bash - Takes care of most of the hoop jumping needed to get your mod packaged for release to Steam. Not necessary for other mod sites who allow uploads of loose files.
    TES5Edit - Shows you what files are included in your mod and how they are interacting with their respective masterfiles and/or other mods. Useful for finding mistakes and conflicts. Experimental.
    Clean Saves - make your own or use my resource. Probably both. You'll want saves made at key points around the area and time frame in game that you'll be modding. For example - if your quest doesn't start until after a certain event, make a clean save before and after that event. This way you will be able to test if your quest triggers properly even if a downloader installs it on a game that has already passed that checkpoint.
    Notepad ++ - Text documents on steroids. Infinitely helpful for scripting. It numbers lines, helps you line up indented code properly. Such nice, much syntax.
    7 zip - File compressor and extractor.  Skyrim scripts now come packaged in a .zip file and need to be decompressed to be edited

     

    Dialogue Length Extender - A quick guide for how to extend the 80 character limit on dialogue lines for the Creation Kit.
     
    Tools you should already have
    Skyrim - Downloaded from Steam or installed from a disc. I recommend making a shortcut to this directory. You'll be going here a lot.
    Creation Kit - Downloaded from Steam and installed into the same folder as Skyrim.
    Archive.exe - comes with the Creation Kit (I believe) and is also in the same folder as Skyrim. Used with Wrye Bash to package a mod for upload to Steam.
     
    Useful Console Commands - These are indispensable for testing a custom quest to ensure it is functioning properly since almost all of what a quest does is behind the scenes.
    Open the console with the tilde (~)
    Commands contained in <brackets> indicates a variable that must be specified.
    Page Up and Page Down keys can be used to scroll up or down the Console gui
    getstage <quest ID> - returns the current stage of the quest
    movetoqt <quest ID> - moves you to the location of the current target of the quest, eg. where the map marker is pointing.
    setstage <quest ID> <stage #> - manually sets the stage of a quest. Setting a quest stage will begin the quest if it has not already begun.
    sqs <quest ID> - Shows quest stages in a quest and if a stage has been achieved.
    sqo - Shows a human friendly list of active and completed quest objectives for currently active quests.
    resetquest <questid> - Sets all quest stages in a quest to 0.
    coc <cell ID> - teleports the player to the cell specified.
    player.moveto <reference ID> - teleports the player to the reference specified, eg. an NPC or unique item.
     
    Part II: Preparation
     
    Now that you have your tools there are a few things you will need know more about.
    Script Fragments - used by a quest to determine how it behaves, when objectives are displayed/completed, when dialogue occurs, quest completion and advancement, ect.  The Creation Kit has a default prefix it attaches to all fragments.  For convenience you will want to change this default to be able to tell your own script fragments apart from original ones.
     

    ScriptPrefix.png.e8c9c8cefd49a9a6eedaa9723c34bb2d.png

     

    To do this go to File>Preferences>Scripts>Fragment File Prefix in the CK window and fill it in with something that makes it yours.  Hit Apply.
     
    :smarty:Smarty Says: Use the same prefix for any files you create inside your mod!  This will help you locate them in the Object Window and elsewhere.
     
    You also need an outline for your quest.  Each bullet in your outline will become a Quest Stage.

     

    • Quest Begin Stage 0 The quest has started but the Player has not spoken with Archmage Savos Aren
    • Quest Objective Assigned Stage 10 The Player has spoken with Savos Aren or is the Archmage
    • Quest Completion Stage 20 The Player completed the previous Objective and ended the quest

    The beginning of a quest is always invisible to the player.  Without the quest having already begun quest objectives cannot be assigned.  Quest dependent dialogue, items, events, and anything else included in your quest will not be enabled and quest stages cannot be advanced.  Part of quest creation will be determining how your quest will start.  Will it start when the game starts (Unbound)?  Will the player find a long forgotten tome that leads them to your quest (Rebel's Cairn)?  Will they walk into a room ( The Golden Claw)?  Will it be a combination of these things (Boethiah's Calling)?
    Quests that start when the game starts can be a  strain on someone's save game and even corrupt it over time.  Reading a book requires the creation and placement of said book and making sure the player knows how to find it in your mod description.  Picking up an item has similar problems.  Walking into a room, however... Can be done easily.  I recommend using an interior cell to minimize conflicts with other mods and finding an interior cell your player will have to pass through during normal game play in order to complete your quest.
    Then you need to know how many objectives there will be - ours only has one objective.  You can always add more and once you know how to manage one, adding more is simple.
    And lastly you need to end your quest which is more complex than it sounds.  More on this later.
     
    Part III: Turning on the Creation Kit
    You thought I'd never let you.  Well, now's your chance!  We're finally ready.
    Turn on the Creation Kit and load the Skyrim.esm only.  The default settings on the Creation Kit do not allow multiple master files to run simultaneously.  It is possible, but not covered here.
     
    Starting the Quest: This tutorial quest involves only locations and NPC's from the Mage's College.  There's no reason for this quest to begin running silently in the background until the player is there so we will put our quest's jump start in the Hall of Elements - the first interior cell in the Mage's College the player will enter.
     

    CellLoad.png.51ab6549ef731168d501dd513cc60f13.png

     

    Find it in the Cell View window under Interior World Spaces and double click it to load it in the Render Window.  We want the player to activate our quest as soon as they enter the room and the easiest way to do that is with a trigger.  You'll need to be able to see Triggers to do this so enable them by hitting "M" on your keyboard.  Your view should be of the main entryway of the Hall of Elements.
     

     

    Trigger.png.2b8b5a5259222c6854fe683e86840d4c.png

     

    Notice the big orange box taking up the entire room.  This is a trigger.  We're not going to use it though, except as a nice large object to create our own trigger around.  Triggers when created will appear in the render window around an object that is selected so click on the big orange box.  When you do you'll notice MG06SceneTrigger will now be highlighted in the Cell View window in the loaded cell's object list.
    Look for the Create Trigger button on the top bar of your Creation Kit Window and click it.
     

     

    3b05ae4c-9e58-4d93-952e-46eee3a0df60.png.3a52e21cffec89a258102d102119c85d.png

    A new window will pop up asking you to select a form.  Double click NEW and name your new trigger.
     

     

    NewTriggerForm01.png.aaa25c76c8f03b30be06bbb3172a56f7.png

     

    VainSQTrigger = My modder prefix, what my trigger is for (Sorcerer's Quest), and that it's a trigger.  A good naming convention will be vital for what we're doing due to the sheer number of almost identical things involved in a quest.  Once we reach dialogue creation you'll understand more.
    Hit okay and a nice friendly box will appear that is your new trigger!  Looks complex but the only thing you do here is add a script to it.
     

     

    TriggerProperties1.png.82855ea88d14750041f765fa2c8c874b.png

     

    Just like with the trigger select [New Script] and name it something sensible.  Since we're adding it directly to the trigger the CK has politely filled in what our script extends already for us.
     

     

    TriggerScript1.png.1929102c7aa2bc857e8a652dc7c87899.png

     

    From Papyrus 101 you should know basic script construction.  Declare Properties at the beginning, put in your events and conditionals, end everything properly and COMPILE.
    Now we get to use Notepad++!
     

     

    EditTriggerScript1.png.d93c8ac30b2d8afc4ae7864c965a9014.png

     

    If this option is greyed out for you then you need to locate your Scripts folder in the Skyrim>Data folder.  You should have a Skyrim>Data>Scripts>Source folder.  The top folder Scripts will either be empty or contain .pex files (the scripts we are working on may be in here).  Don't touch .pex files, they are generated when a script is compiled by the CK.  They are what the game looks for when seeking out custom scripts.  The scripts that you can look at, modify, extend, and otherwise mess with are in the Scripts>Source folder.

    If this option is greyed out for you and you already have a Scripts>Source folder then the scripts you are trying to modify is more than likely compressed in the Scripts.rar and you should extract the files with 7 zip to your existing folder.  If prompted to overwrite any files, DO IT.  As mentioned, the scripts in your Source folder are the untouched versions of the scripts and the game doesn't even use them - they are for documentation only.  The Scripts.rar doesn't have any .pex files so all your mods will still work fine.

    :smarty: Smarty Says: Never modify a source file script directly.  As with all resources, duplicate and rename all the files you use, even scripts!  Note* There are some cases where this will not work (changes in the shapeshifting mechanics for werewolves and vampries) - proceed with extreme caution and back everything up.

    This should open up your script in Notepad++.  If it doesn't, you'll need to go and make Notepad++ the default editor for .psc files.  The only line that should be visible is the first line.  You'll have to fill in the rest.
    Here's a good example - 

     

     

    Spoiler
    
    1. Scriptname VainSQTScript extends ObjectReference
    2.
    3. Int RunOnce
    4. Quest Property VainSQ Auto
    5. Actor Property PlayerREF Auto
    6. Faction Property CollegeofWinterholdArchmageFaction Auto
    7.
    8.  Event OnTriggerEnter(ObjectReference akActionRef)
    9.    If akActionRef == PlayerREF
    10.       If RunOnce == 0
    11.         VainSQ.Start()
    12.         VainSQ.SetStage(0)
    13.         RunOnce = 1
    14.      EndIf
    15.   EndIf
    16.   If Game.Getplayer().IsInFaction(CollegeofWinterholdArchmageFaction) == True
    17.      VainSQ.SetStage(10)
    18.      VainSQ.SetObjectiveDisplayed(10)
    19.   EndIf
    20. EndEvent

     


    Here's a rundown of what you're looking at with this script.

     

    Spoiler
    1. VainSQTScript - Vain is my modder prefix so I can instantly tell if the object, script, or whatever I'm looking at is part of my modifications. SQT stands for Sorcerer's Quest Trigger and all script names end in Script. The trigger is an object so the script is extending that reference. Then you have to declare the properties of the script.
    2.  
    3. Int RunOnce - Int is short for Integer. By default, since RunOnce is a creation of this script, it has no value and so = 0
    4. The Quest Property will be the name of your quest in the Creation Kit in this case - VainSQ. The game sets this value itself, so it is Auto.
    5. The Actor Property determines who the script effects - PlayerREF stands for Player Reference which is the actual player and excludes all other NPC actors. The game also sets this value itself, so... you guessed it - Auto.
    6. The Faction Property determines if the script effects a specific faction - This is the Faction ID unique to the Archmage.  Also auto.
    7.  
    8. The Event is the conditions under which the script will run. OnTriggerEnter(ObjectReference akActionRef) - When the trigger is entered (the ObjectReference) by an actor (the akActionRef).
    9. Now we have If statements. These determine the conditions under which whatever the event does is done. If the If's don't coincide with what's happening in the game then the event won't occur. This one means if the actor entering the trigger is the player - go on to the next line of code. If this is not the case end the event.
    10. This one detects if RunOnce still is set to 0. If it is, go on to the next line of code, if not... you get the picture.
    11. This line is pretty obvious - the quest is now started and quest dependent activities can occur. Special dialogue, quest objects appearing in the world, everything governed by the quest is now active and waiting on the player's next move.
    12. Just in case the game didn't pick up on it, we want to be extra sure that the quest is on the appropriate stage - 0.
    13. Then we set RunOnce to 1 so that the next time the player walks through this space the quest doesn't start again.
    14. End the conditional.
    15. Each one has to be done separately.
    16. Curve ball!  Same event, but new conditional!  When the player walks into the trigger the game will also check to see if the player (Game.GetPlayer with blank parenthesis because there is only one player) is part of a faction (IsInFaction with the Faction ID in the parenthesis).  The == True tells the game that the player must be part of the faction to execute the next line of code.  If it said == False it would only work as long as the player was not part of the faction referenced. This is important because if the Player is the Archmage... this means Savos Aren - the original assigner of the objective - is no longer part of the game and without this the quest would be incompletable.
    17. This sets the quest stage to 10 - where the first objective is assigned and visible in the quest journal.
    18. This gives us the drumroll we all know and love along with a nice little popup of the objective (same # as the stage usually) for the player so that they know they just advanced the quest.
    19. End the last IF
    20. and the Event.  You'll notice we didn't tell the script to never do this again like we did for the start quest command.  This is because once the game has set a quest stage it cannot set the same stage again - these lines do effectively nothing once the quest advances and/or completes.  If you are really concerned about it you could set an IF statement for RunOnce == 1 and have it set to 2 upon completion.  The indentations and capitalizations and empty lines are for convenience only and have no effect on the script and the numbers for each line should not be included.

     

    AND SAVE!  Once you have saved you can now compile it.  In the main CK window there's a drop down menu for Gameplay.  On it is the Papyrus Script Manager and this is where you compile.
     

    Compile1.png.14650de86f76585dd8219b37760c5731.png

     

    If your syntax is correct a box will pop up for a moment and then disappear.  If you have any mistakes then the compiler will throw errors at you until you fix them.  They are usually helpful errors such as "Missing L Paren at 31, 2" which means you forgot a left parenthesis on line 31 column 2.  This will not tell you if your script does anything, it will only check to make sure that your syntax is correct.

    And that's all we'll do with this for now.  Once our script has an actual quest to refer to we can come back and make sure the properties we set fill properly.

    The last bit of setup is placing the quest objective.  The objective is an amulet in the Archmage's Quarters.  In the Object Window under Items>Armor>AmuletsandRings find one you like the look of, duplicate it, and rename it to stick with your naming convention.  Then load up the Archmage's Quarters in the Render Window and drag the amulet into the room.  Edit it and select Don't Havok Settle (so it won't go flying or get shouted into a wall) and UNCHECK Respawn.  What's the point of making a unique amulet you can only get with this quest if it keeps coming back?

     

    • Thanks 1
  5. This may help you a little - 
    The script you are using is an ObjectReference Script.
    It is going to effect a person so you then progress to Actor Script for things you want to do here.
    Then we can go to GetEquippedWeapon (you only want this to be in effect if that weapon is equipped), IsWeaponDrawn, IsWeaponOut, SheatheWeapon (SKSE Function) but I did NOT see anything for OnSheathe so you'd have to do something with IsWeaponOut/Drawn = false to have it remove something when the weapon is sheathed if the conditions on the spell effect don't work...

     

    Perhaps we're using IsWeaponDrawn when we really want IsWeaponOut or vice versa - you may wish to experiment a little.

  6. That means it's missing a right parenthesis.  And the weapon would be enchanted but the enchant shouldn't effect the player unless the weapon is out if the IsWeaponOut flag is set.  Are you saying it still does in your game and if so, have you tried on a clean save and in a new cell.

     

    Example - Boethiah's Cloak.  When worn gives the player immunity to the sun if they're a vampire (scriptlessly if not using Dawnguard or Vampire Lord).  It's not a weapon though so I haven't tested the IsWeaponDrawn flag but it should work exactly the same as all the other flags.

     

    Parenthesis looks like it's actually missing from this line.

    if (akActor == Game.GetPlayer() && actionType == 7

    Which should then read

    if akActor == Game.GetPlayer() && actionType == 7

    There was a left parenthesis where it didn't belong.  I think.

  7. To apply a magic effect to the player (or remove it) the command is not apply OR remove - he was just saying to do that there, he didn't not actually post fully functional code.

    Event OnActorAction(int actionType, Actor akActor, Form source, int slot)
    if (akActor == Game.GetPlayer() && actionType == 7
    Game.GetPlayer().AddSpell(YourSpell, false) ;false means the spell will be added silently with no notification to the player
    Else
    Game.GetPlayer().RemoveSpell(YourSpell, false)
    EndEvent

    In order to tell it when to do this you will have to do an update thing but if you are using OnUpdate it contributes to save game bloat since this is ALWAYS ON even if they don't have the weapon, don't have it equipped, all sortsa things.

    You may also be able to do something without any scripting.  It's actually pretty easy with items.

    Make sure your spell is attached to the weapon somehow.

    I used a keyword with mine - you may also want to add a specific keyword to your item.

     

    Now go to your spell in the CK.

    Your spell has effects listed I assume.

    Double click to open an effect.

    Right click and select New in the Conditions box.

    The condition you want is WornHasKeyword, set the keyword, and make it == 1

    Also IsWeaponOut, set the weapon, and make it == 1

    See if it works.

  8. Maybe on one of my day's off I'm going to go through the Dawnguard vampire lord changes and see how their revert function works.  It's built off of what appears to be the skeleton of the werewolf change scripts (even has some werewolf specific lines commented out such as the one which applies the werewolf skin to the player).

     

    So my theory is that creating a revert script that calls back to the original PlayerWerewolfChangeScript without actually touching it (maybe attached to the quest maybe a spell, we'll see if I feel up to adding a quick slot menu for Werewolves...) that this would enable a scripter to do what I have done without having to modify vanilla game data (only 2 unvalidated files, but boy the CK ain't happy...)

  9. Well good news and bad news!  Good news first!

    The SKSE is not my problem.

     

    Bad news!  If I extend the original PlayerWerewolfChangeScript with my Vain01WerewolfChangeScript - no matter if I change nothing about the script at all I automatically revert to human form after the initial transformation completes...  I hate your coders, Bethesda.  I hate them so hard.

     

    If I try to duplicate the original script exactly, no changes, and extend the quest like it does - the transformation sequence breaks.  Your armor is not unequipped and stored in the container in the Underforge like it's supposed to be, your animation breaks, and you are no longer able to move or move the camera or do anything, and who knows how many other game breaking things happen that you can't even see.

    The reason for this is the script fragment QF_PlayerWerewolfQuest_0002BA16 which is also attached to the quest.  It specifically references the original script and will not work with a straight up replacement unless it was named identically.

     

    Welp... cya later!  I'm off to break the game!

  10. To enable the player to leave Beast Form by holding a button.  Requires the Skyrim Script Extender.  Before you make any of the following changes to scripts I recommend making backups of the scripts you are editing, failure to do so make break your game and you may have to delete your scripts folder and verify the cache of your creation kit to repair it - repairing Skyrim will do nothing.

     

     

    Doesn't actually work... Long story...

    PlayerWerewolfChangeScript - 

    Create a new script and copy/paste the contents of this script.

    Change line 1 to Scriptname <name> extends PlayerWerewolfChangeScript

    Remove lines 3 through 64

    Save and compile.

    If you get any errors be sure you removed all the original Properties and nothing else.

     

    EditedWerewolfChangeScript - 

    Add lines 4-13, 21,22,176-195, 221-228, and 378-386.

    Save and compile.

    If you get an error about the Input command, you do not have SKSE installed correctly.  Download the .zip or .7z and install it manually.

    If you get errors about the Spells or Spell Properties, you need to create these in order to add them to the script.  I based mine off of the original PlayerWerewolfLvl10-50AndBelow/OverAbility spells.  If you are using Dawnguard the spells effects will be slightly different than in Vanilla not to mention the script got a significant overhaul that I didn't notice before... It's very subtle.

    Scriptname EditedWerewolfChangeScript extends PlayerWerewolfChangeScript

     
    4   Spell Property PlayerWerewolfLvl55AndBelowAbility auto
    5   Spell Property PlayerWerewolfLvl60AndBelowAbility auto
    6   Spell Property PlayerWerewolfLvl65AndBelowAbility auto
    7   Spell Property PlayerWerewolfLvl70AndBelowAbility auto
    8   Spell Property PlayerWerewolfLvl75AndBelowAbility auto
    9   Spell Property PlayerWerewolfLvl80AndBelowAbility auto
    10 Spell Property PlayerWerewolfLvl85AndBelowAbility auto
    11 Spell Property PlayerWerewolfLvl90AndBelowAbility auto
    12 Spell Property PlayerWerewolfLvl95AndBelowAbility auto
    13 Spell Property PlayerWerewolfLvl100AndOverAbility auto
     
    float __durationWarningTime = -1.0
    float __feedExtensionTime = -1.0
    bool __tryingToShiftBack = false
    bool __shiftingBack = false
    bool __shuttingDown = false
    bool __trackingStarted = false
     
    21 Bool bIsHotkeyPressed
    22 Int Property iHotkey = 33 Auto ; the F key
     
    float Function RealTimeSecondsToGameTimeDays(float realtime)
        float scaledSeconds = realtime * TimeScale.Value
        return scaledSeconds / (60 * 60 * 24)
    EndFunction
     
    float Function GameTimeDaysToRealTimeSeconds(float gametime)
        float gameSeconds = gametime * (60 * 60 * 24)
        return (gameSeconds / TimeScale.Value)
    EndFunction
     
    Function PrepShift()
    ;     Debug.Trace("WEREWOLF: Prepping shift...")
        Actor player = Game.GetPlayer()
     
        ; sets up the UI restrictions
        Game.SetBeastForm(True)
        Game.EnableFastTravel(False)
     
        ; set up perks/abilities
        ;  (don't need to do this anymore since it's on from gamestart)
        ; Game.GetPlayer().AddPerk(PlayerWerewolfFeed)
     
        ; screen effect
        WerewolfChange.Apply()
        WerewolfIMODSound.Play(Game.GetPlayer())
     
        ; get rid of your summons
        int count = 0
        while (count < WerewolfDispelList.GetSize())
            Spell gone = WerewolfDispelList.GetAt(count) as Spell
            if (gone != None)
                Game.GetPlayer().DispelSpell(gone)
            endif
            count += 1
        endwhile
     
     
        Game.DisablePlayerControls(abMovement = false, abFighting = false, abCamSwitch = true, abMenu = false, abActivate = false, abJournalTabs = false, aiDisablePOVType = 1)
        Game.ForceThirdPerson()
        Game.ShowFirstPersonGeometry(false)
    EndFunction
     
    Function InitialShift()
    ;     Debug.Trace("WEREWOLF: Player beginning transformation.")
     
        WerewolfWarn.Apply()
     
        if (Game.GetPlayer().IsDead())
    ;         Debug.Trace("WEREWOLF: Player is dead; bailing out.")
            return
        endif
     
        ; actual switch
        Game.GetPlayer().SetRace(WerewolfBeastRace)
    EndFunction
     
    Function StartTracking()
        if (__trackingStarted)
            return
        endif
     
        __trackingStarted = true
     
    ;     Debug.Trace("WEREWOLF: Race swap done; starting tracking and effects.")
        
        ; take all the player's stuff (since he/she can't use it anyway)
        ; Game.GetPlayer().RemoveAllItems(LycanStash)
        Game.GetPlayer().UnequipAll()
        Game.GetPlayer().EquipItem(WolfSkinFXArmor, False, True)
     
        ;Add Blood Effects
        ;FeedBloodVFX.Play(Game.GetPlayer())
     
        ; make everyone hate you
        Game.GetPlayer().SetAttackActorOnSight(true)
     
        ; alert anyone nearby that they should now know the player is a werewolf
        Game.SendWereWolfTransformation()
     
        Game.GetPlayer().AddToFaction(PlayerWerewolfFaction)
        Game.GetPlayer().AddToFaction(WerewolfFaction)
        int cfIndex = 0
        while (cfIndex < CrimeFactions.GetSize())
    ;         Debug.Trace("WEREWOLF: Setting enemy flag on " + CrimeFactions.GetAt(cfIndex))
            (CrimeFactions.GetAt(cfIndex) as Faction).SetPlayerEnemy()
            cfIndex += 1
        endwhile
     
        ; but they also don't know that it's you
        Game.SetPlayerReportCrime(false)
     
        ; recalc times
        __durationWarningTime = RealTimeSecondsToGameTimeDays(DurationWarningTimeSeconds)
        __feedExtensionTime   = RealTimeSecondsToGameTimeDays(FeedExtensionTimeSeconds)
     
        ; unequip magic
        Spell left = Game.GetPlayer().GetEquippedSpell(0)
        Spell right = Game.GetPlayer().GetEquippedSpell(1)
        Spell power = Game.GetPlayer().GetEquippedSpell(2)
        Shout voice = Game.GetPlayer().GetEquippedShout()
        if (left != None)
            Game.GetPlayer().UnequipSpell(left, 0)
        endif
        if (right != None)
            Game.GetPlayer().UnequipSpell(right, 1)
        endif
        if (power != None)
            ; some players are overly clever and sneak a power equip between casting
            ;  beast form and when we rejigger them there. this will teach them.
    ;         Debug.Trace("WEREWOLF: " + power + " was equipped; removing.")
            Game.GetPlayer().UnequipSpell(power, 2)
        else
    ;         Debug.Trace("WEREWOLF: No power equipped.")
        endif
        if (voice != None)
            ; same deal here, but for shouts
    ;         Debug.Trace("WEREWOLF: " + voice + " was equipped; removing.")
            Game.GetPlayer().UnequipShout(voice)
        else
    ;         Debug.Trace("WEREWOLF: No shout equipped.")
        endif
     
        ; but make up for it by giving you the sweet howl
        CurrentHowlWord1 = (CompanionsTrackingQuest as CompanionsHousekeepingScript).CurrentHowlWord1
        CurrentHowlWord2 = (CompanionsTrackingQuest as CompanionsHousekeepingScript).CurrentHowlWord2
        CurrentHowlWord3 = (CompanionsTrackingQuest as CompanionsHousekeepingScript).CurrentHowlWord3
        CurrentHowl = (CompanionsTrackingQuest as CompanionsHousekeepingScript).CurrentHowl
     
        Game.UnlockWord(CurrentHowlWord1)
        Game.UnlockWord(CurrentHowlWord2)
        Game.UnlockWord(CurrentHowlWord3)
        Game.GetPlayer().AddShout(CurrentHowl)
        Game.GetPlayer().EquipShout(CurrentHowl)
     
        ; and some rad claws
        int playerLevel = Game.GetPlayer().GetLevel()
        if     (playerLevel <= 10)
            Game.GetPlayer().AddSpell(PlayerWerewolfLvl10AndBelowAbility, false)
        elseif (playerLevel <= 15)
            Game.GetPlayer().AddSpell(PlayerWerewolfLvl15AndBelowAbility, false)
        elseif (playerLevel <= 20)
            Game.GetPlayer().AddSpell(PlayerWerewolfLvl20AndBelowAbility, false)
        elseif (playerLevel <= 25)
            Game.GetPlayer().AddSpell(PlayerWerewolfLvl25AndBelowAbility, false)
        elseif (playerLevel <= 30)
            Game.GetPlayer().AddSpell(PlayerWerewolfLvl30AndBelowAbility, false)
        elseif (playerLevel <= 35)
            Game.GetPlayer().AddSpell(PlayerWerewolfLvl35AndBelowAbility, false)
        elseif (playerLevel <= 40)
            Game.GetPlayer().AddSpell(PlayerWerewolfLvl40AndBelowAbility, false)
        elseif (playerLevel <= 45)
            Game.GetPlayer().AddSpell(PlayerWerewolfLvl45AndBelowAbility, false)
    176    elseif (playerLevel <= 50)
    177        Game.GetPlayer().AddSpell(PlayerWerewolfLvl50AndOverAbility, false)
    178    elseif (playerLevel <= 55)
    179        Game.GetPlayer().AddSpell(PlayerWerewolfLvl55AndBelowAbility, false)
    180    elseif (playerLevel <= 60)
    181        Game.GetPlayer().AddSpell(PlayerWerewolfLvl60AndBelowAbility, false)
    182    elseif (playerLevel <= 65)
    183        Game.GetPlayer().AddSpell(PlayerWerewolfLvl65AndBelowAbility, false)
    184    elseif (playerLevel <= 70)
    185        Game.GetPlayer().AddSpell(PlayerWerewolfLvl70AndBelowAbility, false)
    186    elseif (playerLevel <= 75)
    187        Game.GetPlayer().AddSpell(PlayerWerewolfLvl75AndBelowAbility, false)
    188    elseif (playerLevel <= 80)
    189        Game.GetPlayer().AddSpell(PlayerWerewolfLvl80AndBelowAbility, false)
    190    elseif (playerLevel <= 85)
    191        Game.GetPlayer().AddSpell(PlayerWerewolfLvl85AndBelowAbility, false)
    192    elseif (playerLevel <= 90)
    193        Game.GetPlayer().AddSpell(PlayerWerewolfLvl90AndBelowAbility, false)
    194    else
    195        Game.GetPlayer().AddSpell(PlayerWerewolfLvl100AndOverAbility, false)
        endif
     
        ; calculate when the player turns back into a pumpkin
        float currentTime = GameDaysPassed.GetValue()
        float regressTime = currentTime + RealTimeSecondsToGameTimeDays(StandardDurationSeconds)
        PlayerWerewolfShiftBackTime.SetValue(regressTime)
    ;     Debug.Trace("WEREWOLF: Current day -- " + currentTime)
    ;     Debug.Trace("WEREWOLF: Player will turn back at day " + regressTime)
     
        ; increment stats
        Game.IncrementStat("Werewolf Transformations")
     
        ; set us up to check when we turn back
        RegisterForUpdate(5)
     
        SetStage(10) ; we're done with the transformation handling
    EndFunction
     
    Event OnUpdate()
        if (Untimed)
            return
        endif
        float currentTime = GameDaysPassed.GetValue()
        float regressTime = PlayerWerewolfShiftBackTime.GetValue()
     
    221 If bIsHotkeyPressed != Input.IsKeyPressed(iHotkey)
    222    bIsHotkeyPressed = !bIsHotkeyPressed
    223       If bIsHotkeyPressed
    224       SetStage(100)
    225       return
    226       Else
    227       EndIf
    228 EndIf
     
        if (  (currentTime >= regressTime) && (!Game.GetPlayer().IsInKillMove()) && !__tryingToShiftBack )
            UnregisterForUpdate()
            SetStage(100) ; time to go, buddy
            return
        endif
     
        if (currentTime >= regressTime - __durationWarningTime)
            if (GetStage() == 10)
                SetStage(20)  ; almost there
                return
            endif
        endif
     
    ;     Debug.Trace("WEREWOLF: Checking, still have " + GameTimeDaysToRealTimeSeconds(regressTime - currentTime) + " seconds to go.")
    EndEvent
     
    Function SetUntimed(bool untimedValue)
        Untimed = untimedValue
        if (Untimed)
            UnregisterForUpdate()
        endif
    EndFunction
     
    ; called from stage 11
    Function Feed(Actor victim)
        float newShiftTime = PlayerWerewolfShiftBackTime.GetValue() + __feedExtensionTime
        Game.GetPlayer().PlayIdle(SpecialFeeding)
        
        ;This is for adding a spell that simulates bleeding
        BleedingFXSpell.Cast(victim,victim)
        
        if (!C03Rampage.IsRunning())
            PlayerWerewolfShiftBackTime.SetValue(newShiftTime)
            PlayerWerewolfFeedMessage.Show()
            FeedBoost.Cast(Game.GetPlayer())
            ; victim.SetActorValue("Variable08", 100)
    ;         Debug.Trace("WEREWOLF: Player feeding -- new regress day is " + newShiftTime)
        endif
        SetStage(10)
    EndFunction
     
     
    ; called from stage 20
    Function WarnPlayer()
    ;     Debug.Trace("WEREWOLF: Player about to transform back.")
        WerewolfWarn.Apply()
    EndFunction
     
     
    ; called from stage 100
    Function ShiftBack()
        __tryingToShiftBack = true
     
        while (Game.GetPlayer().GetAnimationVariableBool("bIsSynced"))
    ;         Debug.Trace("WEREWOLF: Waiting for synced animation to finish...")
            Utility.Wait(0.1)
        endwhile
    ;     Debug.Trace("WEREWOLF: Sending transform event to turn player back to normal.")
     
        __shiftingBack = false
        ; RegisterForAnimationEvent(Game.GetPlayer(), "TransformToHuman")
        ; Game.GetPlayer().PlayIdle(WerewolfTransformBack)
        ; Utility.Wait(10)
        ActuallyShiftBackIfNecessary()
    EndFunction
     
    Event OnAnimationEvent(ObjectReference akSource, string asEventName)
        if (asEventName == "TransformToHuman")
            ActuallyShiftBackIfNecessary()
        endif
    EndEvent
     
    Function ActuallyShiftBackIfNecessary()
        if (__shiftingBack)
            return
        endif
     
        __shiftingBack = true
     
    ;     Debug.Trace("WEREWOLF: Player returning to normal.")
     
        Game.SetInCharGen(true, true, false)
     
        UnRegisterForAnimationEvent(Game.GetPlayer(), "TransformToHuman")
        UnRegisterForUpdate() ; just in case
     
        if (Game.GetPlayer().IsDead())
    ;         Debug.Trace("WEREWOLF: Player is dead; bailing out.")
            return
        endif
     
        ;Remove Blood Effects
        ;FeedBloodVFX.Stop(Game.GetPlayer())
     
        ; imod
        WerewolfChange.Apply()
        WerewolfIMODSound.Play(Game.GetPlayer())
     
        ; get rid of your summons if you have any
        int count = 0
        while (count < WerewolfDispelList.GetSize())
            Spell gone = WerewolfDispelList.GetAt(count) as Spell
            if (gone != None)
    ;             Debug.Trace("WEREWOLF: Dispelling " + gone)
                Game.GetPlayer().DispelSpell(gone)
            endif
            count += 1
        endwhile
     
        ; make sure the transition armor is gone
        Game.GetPlayer().UnequipItem(WolfSkinFXArmor, False, True)
     
        ; clear out perks/abilities
        ;  (don't need to do this anymore since it's on from gamestart)
        ; Game.GetPlayer().RemovePerk(PlayerWerewolfFeed)
     
        ; make sure your health is reasonable before turning you back
        ; Game.GetPlayer().GetActorBase().SetInvulnerable(true)
        Game.GetPlayer().SetGhost()
        float currHealth = Game.GetPlayer().GetAV("health")
        if (currHealth <= 70)
    ;         Debug.Trace("WEREWOLF: Player's health is only " + currHealth + "; restoring.")
            Game.GetPlayer().RestoreAV("health", 70 - currHealth)
        endif
     
        ; change you back
    ;     Debug.Trace("WEREWOLF: Setting race " + (CompanionsTrackingQuest as CompanionsHousekeepingScript).PlayerOriginalRace + " on " + Game.GetPlayer())
        Game.GetPlayer().SetRace((CompanionsTrackingQuest as CompanionsHousekeepingScript).PlayerOriginalRace)
     
        ; release the player controls
    ;     Debug.Trace("WEREWOLF: Restoring camera controls")
        Game.EnablePlayerControls(abMovement = false, abFighting = false, abCamSwitch = true, abLooking = false, abSneaking = false, abMenu = false, abActivate = false, abJournalTabs = false, aiDisablePOVType = 1)
        Game.ShowFirstPersonGeometry(true)
     
        ; no more howling for you
        Game.GetPlayer().UnequipShout(CurrentHowl)
        Game.GetPlayer().RemoveShout(CurrentHowl)
     
        ; or those claws
        Game.GetPlayer().RemoveSpell(PlayerWerewolfLvl10AndBelowAbility)
        Game.GetPlayer().RemoveSpell(PlayerWerewolfLvl15AndBelowAbility)
        Game.GetPlayer().RemoveSpell(PlayerWerewolfLvl20AndBelowAbility)
        Game.GetPlayer().RemoveSpell(PlayerWerewolfLvl25AndBelowAbility)
        Game.GetPlayer().RemoveSpell(PlayerWerewolfLvl30AndBelowAbility)
        Game.GetPlayer().RemoveSpell(PlayerWerewolfLvl35AndBelowAbility)
        Game.GetPlayer().RemoveSpell(PlayerWerewolfLvl40AndBelowAbility)
        Game.GetPlayer().RemoveSpell(PlayerWerewolfLvl45AndBelowAbility)
        Game.GetPlayer().RemoveSpell(PlayerWerewolfLvl50AndOverAbility)
    378    Game.GetPlayer().RemoveSpell(PlayerWerewolfLvl55AndBelowAbility)
    379    Game.GetPlayer().RemoveSpell(PlayerWerewolfLvl60AndBelowAbility)
    380    Game.GetPlayer().RemoveSpell(PlayerWerewolfLvl65AndBelowAbility)
    381    Game.GetPlayer().RemoveSpell(PlayerWerewolfLvl70AndBelowAbility)
    382    Game.GetPlayer().RemoveSpell(PlayerWerewolfLvl75AndBelowAbility)
    383    Game.GetPlayer().RemoveSpell(PlayerWerewolfLvl80AndBelowAbility)
    384    Game.GetPlayer().RemoveSpell(PlayerWerewolfLvl85AndBelowAbility)
    385    Game.GetPlayer().RemoveSpell(PlayerWerewolfLvl90AndBelowAbility)
    386    Game.GetPlayer().RemoveSpell(PlayerWerewolfLvl100AndOverAbility)
     
        ; gimme back mah stuff
        ; LycanStash.RemoveAllItems(Game.GetPlayer())
     
        ; people don't hate you no more
        Game.GetPlayer().SetAttackActorOnSight(false)
        Game.GetPlayer().RemoveFromFaction(PlayerWerewolfFaction)
        Game.GetPlayer().RemoveFromFaction(WerewolfFaction)
        int cfIndex = 0
        while (cfIndex < CrimeFactions.GetSize())
    ;         Debug.Trace("WEREWOLF: Removing enemy flag from " + CrimeFactions.GetAt(cfIndex))
            (CrimeFactions.GetAt(cfIndex) as Faction).SetPlayerEnemy(false)
            cfIndex += 1
        endwhile
     
        ; and you're now recognized
        Game.SetPlayerReportCrime(true)
     
        ; alert anyone nearby that they should now know the player is a werewolf
        Game.SendWereWolfTransformation()
     
        ; give the set race event a chance to come back, otherwise shut us down
        Utility.Wait(5)
        Shutdown()
    EndFunction
     
    Function Shutdown()
        if (__shuttingDown)
            return
        endif
     
        __shuttingDown = true
     
        Game.GetPlayer().GetActorBase().SetInvulnerable(false)
        Game.GetPlayer().SetGhost(false)
     
        Game.SetBeastForm(False)
        Game.EnableFastTravel(True)
     
        Game.SetInCharGen(false, false, false)
     
        Stop()
    EndFunction
     
    Keyword Property ActorTypeNPC  Auto  
     

     

    Attach to the PlayerWerewolfChangeQuest.  Auto-fill the Properties but go back through each one and make sure it matches the original script exactly.  Some Properties will fill that you do not want filled and many more will not fill at all and have to be entered manually.  Once they are as identical as possible, remove the original script and hit OK.  Everything should now work perfectly and holding the F key will remove you from Beast Form.

     

    Details.

  11. I've got everything down except I am completely lost as to how to make the game not only detect when a button is being pushed (I want it to update only while a certain script is tracking events - while you are a Werewolf) but that a button is being pushed as well.  The switch point of view key (F default).  View switching is disabled while you are shapeshifted so there should be no conflict.

     

    Help meeeeee

  12. SO... here's the plan.  If the player has completed Hircine's Daedric quest they receive the uncursed Ring of Hircine or Savior's Hide.  Theoretical script will detect the completion of this quest on the character (so it won't matter if they've done it in the past) and detect if they are a werewolf and if so will grant them Blessing of Hircine.  A power that works just like the Ring of Hircine only with the length of the transformation lasting the same length of time as original Beast Form (still extendable through the eating of hearts and whatnot).  This ability will also grant a power bound to the F key that activates when you are in Beast Form that allows you to change back at will.  I'm working on making the proper forms for each of these abilities.

     

     

    The Magic Effect - DA05HircinesRingMagicEffect (duplicated and renamed)

    The Enchantment - DA05HircinesRingEnchantment (duplicated and renamed)

    The Power - WerewolfChangeRingofHircine (duplicated and renamed)

     

    Script Fragment that gives the item to you - 

    Game.GetPlayer().RemoveItem(CursedRing, 1, true)
    Game.GetPlayer().AddItem(NormalRing, 1, true)
    AchievementsQuest.IncDaedricArtifacts()
    
    QuestingBeastGhost.GetRef().Disable()

    There does not appear to be a script (fragment or not) regarding the Savior's Hide (the quest simply removes one item and adds the next).

     

    I copies and renamed the ring script - 

    Scriptname Vain01HircinesBlessingScript extends ObjectReference  
     
    Spell Property Vain01HircinesRingMagicEffect auto
    Quest Property CompanionsCentralQuest auto
     
    Event OnEquipped(Actor akActor)
    if (akActor == Game.GetPlayer() && (CompanionsCentralQuest as CompanionsHousekeepingScript).PlayerHasBeastBlood)
    Game.GetPlayer().AddSpell(Vain01HircinesRingMagicEffect, false)
    endif
    EndEvent

    Replaced the script that was on the ring but the effect is still being removed on unequip...

     

    Now that I have a means of delivering the buff now I need to finish the off switch...

     

    By tying the SetStage.PlayerWerewolfQuest 100 to the F key while shapeshifted and done!

     

    Finished leveling werewolves for non-Dawnguard up to level 100.

     

    Now functioning script for both leveling and hotkeyed revert form. (revert form not waiting for hotkey, just changing back on update)

    Scriptname Vain01WerewolfChangeScript extends PlayerWerewolfChangeScript

     
    ;Vain01
    Spell Property PlayerWerewolfLvl55AndBelowAbility auto
    Spell Property PlayerWerewolfLvl60AndBelowAbility auto
    Spell Property PlayerWerewolfLvl65AndBelowAbility auto
    Spell Property PlayerWerewolfLvl70AndBelowAbility auto
    Spell Property PlayerWerewolfLvl75AndBelowAbility auto
    Spell Property PlayerWerewolfLvl80AndBelowAbility auto
    Spell Property PlayerWerewolfLvl85AndBelowAbility auto
    Spell Property PlayerWerewolfLvl90AndBelowAbility auto
    Spell Property PlayerWerewolfLvl95AndBelowAbility auto
    Spell Property PlayerWerewolfLvl100AndOverAbility auto
    ;Vain01
     
    float __durationWarningTime = -1.0
    float __feedExtensionTime = -1.0
    bool __tryingToShiftBack = false
    bool __shiftingBack = false
    bool __shuttingDown = false
    bool __trackingStarted = false
     
    Bool bIsHotkeyPressed ; Vain01 Script Modification
     
    Int Property iHotkey = 33 Auto ; F by Default Vain01 Script Modification
     
    float Function RealTimeSecondsToGameTimeDays(float realtime)
        float scaledSeconds = realtime * TimeScale.Value
        return scaledSeconds / (60 * 60 * 24)
    EndFunction
     
    float Function GameTimeDaysToRealTimeSeconds(float gametime)
        float gameSeconds = gametime * (60 * 60 * 24)
        return (gameSeconds / TimeScale.Value)
    EndFunction
     
    Function PrepShift()
    ;     Debug.Trace("WEREWOLF: Prepping shift...")
        Actor player = Game.GetPlayer()
     
        ; sets up the UI restrictions
        Game.SetBeastForm(True)
        Game.EnableFastTravel(False)
     
        ; set up perks/abilities
        ;  (don't need to do this anymore since it's on from gamestart)
        ; Game.GetPlayer().AddPerk(PlayerWerewolfFeed)
     
        ; screen effect
        WerewolfChange.Apply()
        WerewolfIMODSound.Play(Game.GetPlayer())
     
        ; get rid of your summons
        int count = 0
        while (count < WerewolfDispelList.GetSize())
            Spell gone = WerewolfDispelList.GetAt(count) as Spell
            if (gone != None)
                Game.GetPlayer().DispelSpell(gone)
            endif
            count += 1
        endwhile
     
     
        Game.DisablePlayerControls(abMovement = false, abFighting = false, abCamSwitch = true, abMenu = false, abActivate = false, abJournalTabs = false, aiDisablePOVType = 1)
        Game.ForceThirdPerson()
        Game.ShowFirstPersonGeometry(false)
    EndFunction
     
    Function InitialShift()
    ;     Debug.Trace("WEREWOLF: Player beginning transformation.")
     
        WerewolfWarn.Apply()
     
        if (Game.GetPlayer().IsDead())
    ;         Debug.Trace("WEREWOLF: Player is dead; bailing out.")
            return
        endif
     
        ; actual switch
        Game.GetPlayer().SetRace(WerewolfBeastRace)
    EndFunction
     
    Function StartTracking()
        if (__trackingStarted)
            return
        endif
     
        __trackingStarted = true
     
    ;     Debug.Trace("WEREWOLF: Race swap done; starting tracking and effects.")
        
        ; take all the player's stuff (since he/she can't use it anyway)
        ; Game.GetPlayer().RemoveAllItems(LycanStash)
        Game.GetPlayer().UnequipAll()
        Game.GetPlayer().EquipItem(WolfSkinFXArmor, False, True)
     
        ;Add Blood Effects
        ;FeedBloodVFX.Play(Game.GetPlayer())
     
        ; make everyone hate you
        Game.GetPlayer().SetAttackActorOnSight(true)
     
        ; alert anyone nearby that they should now know the player is a werewolf
        Game.SendWereWolfTransformation()
     
        Game.GetPlayer().AddToFaction(PlayerWerewolfFaction)
        Game.GetPlayer().AddToFaction(WerewolfFaction)
        int cfIndex = 0
        while (cfIndex < CrimeFactions.GetSize())
    ;         Debug.Trace("WEREWOLF: Setting enemy flag on " + CrimeFactions.GetAt(cfIndex))
            (CrimeFactions.GetAt(cfIndex) as Faction).SetPlayerEnemy()
            cfIndex += 1
        endwhile
     
        ; but they also don't know that it's you
        Game.SetPlayerReportCrime(false)
     
        ; recalc times
        __durationWarningTime = RealTimeSecondsToGameTimeDays(DurationWarningTimeSeconds)
        __feedExtensionTime   = RealTimeSecondsToGameTimeDays(FeedExtensionTimeSeconds)
     
        ; unequip magic
        Spell left = Game.GetPlayer().GetEquippedSpell(0)
        Spell right = Game.GetPlayer().GetEquippedSpell(1)
        Spell power = Game.GetPlayer().GetEquippedSpell(2)
        Shout voice = Game.GetPlayer().GetEquippedShout()
        if (left != None)
            Game.GetPlayer().UnequipSpell(left, 0)
        endif
        if (right != None)
            Game.GetPlayer().UnequipSpell(right, 1)
        endif
        if (power != None)
            ; some players are overly clever and sneak a power equip between casting
            ;  beast form and when we rejigger them there. this will teach them.
    ;         Debug.Trace("WEREWOLF: " + power + " was equipped; removing.")
            Game.GetPlayer().UnequipSpell(power, 2)
        else
    ;         Debug.Trace("WEREWOLF: No power equipped.")
        endif
        if (voice != None)
            ; same deal here, but for shouts
    ;         Debug.Trace("WEREWOLF: " + voice + " was equipped; removing.")
            Game.GetPlayer().UnequipShout(voice)
        else
    ;         Debug.Trace("WEREWOLF: No shout equipped.")
        endif
     
        ; but make up for it by giving you the sweet howl
        CurrentHowlWord1 = (CompanionsTrackingQuest as CompanionsHousekeepingScript).CurrentHowlWord1
        CurrentHowlWord2 = (CompanionsTrackingQuest as CompanionsHousekeepingScript).CurrentHowlWord2
        CurrentHowlWord3 = (CompanionsTrackingQuest as CompanionsHousekeepingScript).CurrentHowlWord3
        CurrentHowl = (CompanionsTrackingQuest as CompanionsHousekeepingScript).CurrentHowl
     
        Game.UnlockWord(CurrentHowlWord1)
        Game.UnlockWord(CurrentHowlWord2)
        Game.UnlockWord(CurrentHowlWord3)
        Game.GetPlayer().AddShout(CurrentHowl)
        Game.GetPlayer().EquipShout(CurrentHowl)
     
        ; and some rad claws
        int playerLevel = Game.GetPlayer().GetLevel()
        if     (playerLevel <= 10)
            Game.GetPlayer().AddSpell(PlayerWerewolfLvl10AndBelowAbility, false)
        elseif (playerLevel <= 15)
            Game.GetPlayer().AddSpell(PlayerWerewolfLvl15AndBelowAbility, false)
        elseif (playerLevel <= 20)
            Game.GetPlayer().AddSpell(PlayerWerewolfLvl20AndBelowAbility, false)
        elseif (playerLevel <= 25)
            Game.GetPlayer().AddSpell(PlayerWerewolfLvl25AndBelowAbility, false)
        elseif (playerLevel <= 30)
            Game.GetPlayer().AddSpell(PlayerWerewolfLvl30AndBelowAbility, false)
        elseif (playerLevel <= 35)
            Game.GetPlayer().AddSpell(PlayerWerewolfLvl35AndBelowAbility, false)
        elseif (playerLevel <= 40)
            Game.GetPlayer().AddSpell(PlayerWerewolfLvl40AndBelowAbility, false)
        elseif (playerLevel <= 45)
            Game.GetPlayer().AddSpell(PlayerWerewolfLvl45AndBelowAbility, false)
    ;Vain01
        elseif (playerLevel <= 50)
            Game.GetPlayer().AddSpell(PlayerWerewolfLvl50AndOverAbility, false)
        elseif (playerLevel <= 55)
            Game.GetPlayer().AddSpell(PlayerWerewolfLvl55AndBelowAbility, false)
        elseif (playerLevel <= 60)
            Game.GetPlayer().AddSpell(PlayerWerewolfLvl60AndBelowAbility, false)
        elseif (playerLevel <= 65)
            Game.GetPlayer().AddSpell(PlayerWerewolfLvl65AndBelowAbility, false)
        elseif (playerLevel <= 70)
            Game.GetPlayer().AddSpell(PlayerWerewolfLvl70AndBelowAbility, false)
        elseif (playerLevel <= 75)
            Game.GetPlayer().AddSpell(PlayerWerewolfLvl75AndBelowAbility, false)
        elseif (playerLevel <= 80)
            Game.GetPlayer().AddSpell(PlayerWerewolfLvl80AndBelowAbility, false)
        elseif (playerLevel <= 85)
            Game.GetPlayer().AddSpell(PlayerWerewolfLvl85AndBelowAbility, false)
        elseif (playerLevel <= 90)
            Game.GetPlayer().AddSpell(PlayerWerewolfLvl90AndBelowAbility, false)
        else
            Game.GetPlayer().AddSpell(PlayerWerewolfLvl100AndOverAbility, false)
    ;Vain01
        endif
     
        ; calculate when the player turns back into a pumpkin
        float currentTime = GameDaysPassed.GetValue()
        float regressTime = currentTime + RealTimeSecondsToGameTimeDays(StandardDurationSeconds)
        PlayerWerewolfShiftBackTime.SetValue(regressTime)
    ;     Debug.Trace("WEREWOLF: Current day -- " + currentTime)
    ;     Debug.Trace("WEREWOLF: Player will turn back at day " + regressTime)
     
        ; increment stats
        Game.IncrementStat("Werewolf Transformations")
     
        ; set us up to check when we turn back
        RegisterForUpdate(5)
     
        SetStage(10) ; we're done with the transformation handling
    EndFunction
     
    Event OnUpdate()
        if (Untimed)
            return
        endif
        float currentTime = GameDaysPassed.GetValue()
        float regressTime = PlayerWerewolfShiftBackTime.GetValue()
     
    ; Vain01 Script Modification - Manual Revert Function
    If bIsHotkeyPressed != Input.IsKeyPressed(33)
    bIsHotkeyPressed = !bIsHotkeyPressed
    If bIsHotkeyPressed
    SetStage(100)
    EndIf
    EndIf
    ; Vain01 End Script Modification
     
        if (  (currentTime >= regressTime) && (!Game.GetPlayer().IsInKillMove()) && !__tryingToShiftBack )
            UnregisterForUpdate()
            SetStage(100) ; time to go, buddy
            return
        endif
     
        if (currentTime >= regressTime - __durationWarningTime)
            if (GetStage() == 10)
                SetStage(20)  ; almost there
                return
            endif
        endif
     
    ;     Debug.Trace("WEREWOLF: Checking, still have " + GameTimeDaysToRealTimeSeconds(regressTime - currentTime) + " seconds to go.")
    EndEvent
     
    Function SetUntimed(bool untimedValue)
        Untimed = untimedValue
        if (Untimed)
            UnregisterForUpdate()
        endif
    EndFunction
     
    ; called from stage 11
    Function Feed(Actor victim)
        float newShiftTime = PlayerWerewolfShiftBackTime.GetValue() + __feedExtensionTime
        Game.GetPlayer().PlayIdle(SpecialFeeding)
        
        ;This is for adding a spell that simulates bleeding
        BleedingFXSpell.Cast(victim,victim)
        
        if (!C03Rampage.IsRunning())
            PlayerWerewolfShiftBackTime.SetValue(newShiftTime)
            PlayerWerewolfFeedMessage.Show()
            FeedBoost.Cast(Game.GetPlayer())
            ; victim.SetActorValue("Variable08", 100)
    ;         Debug.Trace("WEREWOLF: Player feeding -- new regress day is " + newShiftTime)
        endif
        SetStage(10)
    EndFunction
     
     
    ; called from stage 20
    Function WarnPlayer()
    ;     Debug.Trace("WEREWOLF: Player about to transform back.")
        WerewolfWarn.Apply()
    EndFunction
     
     
    ; called from stage 100
    Function ShiftBack()
        __tryingToShiftBack = true
     
        while (Game.GetPlayer().GetAnimationVariableBool("bIsSynced"))
    ;         Debug.Trace("WEREWOLF: Waiting for synced animation to finish...")
            Utility.Wait(0.1)
        endwhile
    ;     Debug.Trace("WEREWOLF: Sending transform event to turn player back to normal.")
     
        __shiftingBack = false
        ; RegisterForAnimationEvent(Game.GetPlayer(), "TransformToHuman")
        ; Game.GetPlayer().PlayIdle(WerewolfTransformBack)
        ; Utility.Wait(10)
        ActuallyShiftBackIfNecessary()
    EndFunction
     
    Event OnAnimationEvent(ObjectReference akSource, string asEventName)
        if (asEventName == "TransformToHuman")
            ActuallyShiftBackIfNecessary()
        endif
    EndEvent
     
    Function ActuallyShiftBackIfNecessary()
        if (__shiftingBack)
            return
        endif
     
        __shiftingBack = true
     
    ;     Debug.Trace("WEREWOLF: Player returning to normal.")
     
        Game.SetInCharGen(true, true, false)
     
        UnRegisterForAnimationEvent(Game.GetPlayer(), "TransformToHuman")
        UnRegisterForUpdate() ; just in case
     
        if (Game.GetPlayer().IsDead())
    ;         Debug.Trace("WEREWOLF: Player is dead; bailing out.")
            return
        endif
     
        ;Remove Blood Effects
        ;FeedBloodVFX.Stop(Game.GetPlayer())
     
        ; imod
        WerewolfChange.Apply()
        WerewolfIMODSound.Play(Game.GetPlayer())
     
        ; get rid of your summons if you have any
        int count = 0
        while (count < WerewolfDispelList.GetSize())
            Spell gone = WerewolfDispelList.GetAt(count) as Spell
            if (gone != None)
    ;             Debug.Trace("WEREWOLF: Dispelling " + gone)
                Game.GetPlayer().DispelSpell(gone)
            endif
            count += 1
        endwhile
     
        ; make sure the transition armor is gone
        Game.GetPlayer().UnequipItem(WolfSkinFXArmor, False, True)
     
        ; clear out perks/abilities
        ;  (don't need to do this anymore since it's on from gamestart)
        ; Game.GetPlayer().RemovePerk(PlayerWerewolfFeed)
     
        ; make sure your health is reasonable before turning you back
        ; Game.GetPlayer().GetActorBase().SetInvulnerable(true)
        Game.GetPlayer().SetGhost()
        float currHealth = Game.GetPlayer().GetAV("health")
        if (currHealth <= 70)
    ;         Debug.Trace("WEREWOLF: Player's health is only " + currHealth + "; restoring.")
            Game.GetPlayer().RestoreAV("health", 70 - currHealth)
        endif
     
        ; change you back
    ;     Debug.Trace("WEREWOLF: Setting race " + (CompanionsTrackingQuest as CompanionsHousekeepingScript).PlayerOriginalRace + " on " + Game.GetPlayer())
        Game.GetPlayer().SetRace((CompanionsTrackingQuest as CompanionsHousekeepingScript).PlayerOriginalRace)
     
        ; release the player controls
    ;     Debug.Trace("WEREWOLF: Restoring camera controls")
        Game.EnablePlayerControls(abMovement = false, abFighting = false, abCamSwitch = true, abLooking = false, abSneaking = false, abMenu = false, abActivate = false, abJournalTabs = false, aiDisablePOVType = 1)
        Game.ShowFirstPersonGeometry(true)
     
        ; no more howling for you
        Game.GetPlayer().UnequipShout(CurrentHowl)
        Game.GetPlayer().RemoveShout(CurrentHowl)
     
        ; or those claws
        Game.GetPlayer().RemoveSpell(PlayerWerewolfLvl10AndBelowAbility)
        Game.GetPlayer().RemoveSpell(PlayerWerewolfLvl15AndBelowAbility)
        Game.GetPlayer().RemoveSpell(PlayerWerewolfLvl20AndBelowAbility)
        Game.GetPlayer().RemoveSpell(PlayerWerewolfLvl25AndBelowAbility)
        Game.GetPlayer().RemoveSpell(PlayerWerewolfLvl30AndBelowAbility)
        Game.GetPlayer().RemoveSpell(PlayerWerewolfLvl35AndBelowAbility)
        Game.GetPlayer().RemoveSpell(PlayerWerewolfLvl40AndBelowAbility)
        Game.GetPlayer().RemoveSpell(PlayerWerewolfLvl45AndBelowAbility)
        Game.GetPlayer().RemoveSpell(PlayerWerewolfLvl50AndOverAbility)
    ;Vain01
    
        Game.GetPlayer().RemoveSpell(PlayerWerewolfLvl55AndBelowAbility)
        Game.GetPlayer().RemoveSpell(PlayerWerewolfLvl60AndBelowAbility)
        Game.GetPlayer().RemoveSpell(PlayerWerewolfLvl65AndBelowAbility)
        Game.GetPlayer().RemoveSpell(PlayerWerewolfLvl70AndBelowAbility)
        Game.GetPlayer().RemoveSpell(PlayerWerewolfLvl75AndBelowAbility)
        Game.GetPlayer().RemoveSpell(PlayerWerewolfLvl80AndBelowAbility)
        Game.GetPlayer().RemoveSpell(PlayerWerewolfLvl85AndBelowAbility)
        Game.GetPlayer().RemoveSpell(PlayerWerewolfLvl90AndBelowAbility)
        Game.GetPlayer().RemoveSpell(PlayerWerewolfLvl100AndOverAbility)
    ;Vain01
    
     
        ; gimme back mah stuff
        ; LycanStash.RemoveAllItems(Game.GetPlayer())
     
        ; people don't hate you no more
        Game.GetPlayer().SetAttackActorOnSight(false)
        Game.GetPlayer().RemoveFromFaction(PlayerWerewolfFaction)
        Game.GetPlayer().RemoveFromFaction(WerewolfFaction)
        int cfIndex = 0
        while (cfIndex < CrimeFactions.GetSize())
    ;         Debug.Trace("WEREWOLF: Removing enemy flag from " + CrimeFactions.GetAt(cfIndex))
            (CrimeFactions.GetAt(cfIndex) as Faction).SetPlayerEnemy(false)
            cfIndex += 1
        endwhile
     
        ; and you're now recognized
        Game.SetPlayerReportCrime(true)
     
        ; alert anyone nearby that they should now know the player is a werewolf
        Game.SendWereWolfTransformation()
     
        ; give the set race event a chance to come back, otherwise shut us down
        Utility.Wait(5)
        Shutdown()
    EndFunction
     
    Function Shutdown()
        if (__shuttingDown)
            return
        endif
     
        __shuttingDown = true
     
        Game.GetPlayer().GetActorBase().SetInvulnerable(false)
        Game.GetPlayer().SetGhost(false)
     
        Game.SetBeastForm(False)
        Game.EnableFastTravel(True)
     
        Game.SetInCharGen(false, false, false)
     
        Stop()
    EndFunction
     
    Keyword Property ActorTypeNPC  Auto

  13. AHAHAHA I lied!  This might be super super easy!  All I have to do to trigger the change back to human form is setstage.playerwerewolfquest 100!  Create a power that issues that command and TADA!  I think I'll release two mods - one mod for Vanilla and a patch to update it to Dawnguard.  BRETTM YOU'RE A GENIOUS AS ALWAYS.

    I still need to add some debug lines to my mod that adjusts the werewolf stats past 50 to be sure it's working...  Those would show up in my Papyrus logs when they trigger, right?

  14. Also I hear it's a really bad idea to actually directly copy anything from any other part of the game (if that's what you did).  You should duplicate the item to create a separate editor ID and put this now unique item where you want it.  The soulgems themselves are also separate items (I assume) and not part of the trap and will have to be placed separately (because they're removable when you encounter them in-game).

  15. Werewolf Mods.
    There are several, some even do what I'm trying to do.  The difference is HOW they do it.
     
    Enable Papyrus Logging - add to SkyrimEditor.ini Papyrus section

    bEnableLogging = 1 
    bEnableTrace = 1 
    bLoadDebugInformation = 1


     
    Enable the use of the Dawnguard master file by the Creation Kit - add to the SkyrimEditor.ini General section

    bAllowMultipleMasterLoads=1


    Also add all the masters you want to be using ordered by release date in the Archive section.  This line should already exist, we are simply elaborating on what is already there.  You may need to add the DLC bsa files to the sArchiveList as well - I did.

    sResourceArchiveList2=Skyrim - Shaders.bsa, Update.bsa, Dawnguard.bsa, Hearthfire.bsa, Dragonborn.bsa


     
    Enable the player to leave Beast Form at will.
    There's not much difference in Werewolves before and after Dawnguard.  Dawnguard makes them a little tougher and gives them perks which can further increase their survivability.  And this really wasn't all that hard, nothing like my sunscreen for Vampires mod.
    Here's a table outlining the Werewolf Damage/Resist Progression in an unmodded game. 

    Werewolf Damage/Resist Progression


    Level___________________10   |  15  |   20   25  30  35    40  45   50   Increment
    Fortify Unarmed Damage___0    |  5    |  15   25  30  35    40   50  60   *
    Feed Blood______________10   |  10  |  100 100 100 100 100 100 100  N/A
    Resist Damage___________N/A |  50  |  100 150 200 250 300 350 400  50
    Number of Increases______1     |  2    |   3     4    5    6     7    8     9    *
    Increment Increased______*     |  5    |   5     10  10   5     5    5    10   10


    So if we follow the same pattern Unarmed Damage will increase by 5 for three levels, then by 10 for two levels, repeating ad finem.  Resist Damage increases by a static 50 each level and Feed Blood just stays the same.
     
    So to continue Werewolf ability progression beyond level 50 we just have to create the spells
    PlayerWerewolfLvl55-95AndBelowAbility (nine spells total)
    PlayerWerewolfLvl99AndAboveAbility
     
    And add them to the player.
    How to do this?  Let's look at how the game does it already.  The Werewolf transformation is managed by a quest.  You begin this quest when you accept the gift of Lycanthropy from the Companions and it only finishes if you choose to cure yourself.  It is not in the quest log.
    PlayerWerewolfChangeQuest
     
    This quest uses two scripts to determine what stage of the quest will be active.
    One script is a fragment.
    The other script explains how the quest behavior is managed.
    PlayerWerewolfChangeScript
     
    Each stage in the quest corresponds to a different point in the Beast Form transition.
     
    Stage 0 and 1 manage the transition
    Stage 10 is normal running around in Beast Form
    Stage 11 manages Werewolf Feed and effects
    Stage 20 warns the player that Beast Form will wear off soon
    Stage 100 triggers the revert back to your normal form
     
    So all that has to be done to create a revert function is to tie a command to trigger Stage 100 of the PlayerWerewolfChangeQuest to a keybind!
     
    Skyrim doesn't have any easy functionality to do this but the Skryim Script Extender does.
    The SKSE adds a new script that allows the Skyrim engine to use a specific key to enter a command.  This is done via the Input script.  This wiki page also contains the different number codes used to specify which key you are using.  We will be using the Boolean Function IsKeyPressed.

    You'll have to add a Property for the Boolean and for the key you're going to be using like so - 

    Bool bIsHotkeyPressed
    Int Property iHotkey = 33 Auto ; the F key

     

    The script should look something like this - 

    If bIsHotkeyPressed != Input.IsKeyPressed(iHotkey)
    bIsHotkeyPressed = !bIsHotkeyPressed
       If bIsHotkeyPressed
          SetStage(100)
          return
       Else
       EndIf
    EndIf

    Instead we are going to use an OnKeyDown event (also from SKSE) using the (Un)RegisterForKey forms. Possible alternate?

    The trouble is... how do you make this into a functioning script?

     

    The way you do this is duplicate the PlayerWerewolfChangeScript and rename it to something else - Vain01WerewolfChangeScript.  But you can't just replace the original script on the quest.  The original script does more than it seems because even if you make a complete replica in all but name and replace it on the quest it breaks the transformation.  100% unplayably so.  Instead of replacing the original script, extend it instead.

    Duplicate the original script only instead of extending a Quest you will extend PlayerWerewolfChangeScript.  This is how the scripting for the new Vampire Lord works in Dawnguard.  These scripts extend the original VampireQuestScript and we're using this as a model for our upgrade to the Werewolf scripts.  Doing this, scripting like we're supposed to, causes the player to revert to human form in the first update event the script calls instead of reverting only when the time is up.

     

    Actually we're going to break the game.  It's the only way I can get it to work.  Our problem is that tiny little script fragment that is also on the quest.  QF_PlayerWerewolfQuest_0002BA16.  Oh how I hate this script.  You can't edit it, you can't remove it, you can't even look at the  :realmad: thing without it breaking.  Well, you can look at it, but don't touch anything.

    I'm not entirely sure what it does or how it works but without it the transformation sequence breaks and while the game does not crash, the player's actor freezes and your armor is still on and a million other problems you can't even see occur.

     

    To sum up - Duplicating and renaming the script will not work and breaks the tranformation.  Creating a script which extends the original script will not work and breaks the transformation.  Editing the original script is the only way this will work.  Pending some discovery of someone on this forum this is currently the easiest and only way I know how to do this.  Other werewolf mods I've seen do this same thing and probably for the same reason - they can't do it any other way.

     

    So now we have the script in a format that will continue to work after we have modified it and modifying it won't break the game.  You should be okay, but this alters original game data and may effect/break your game even with no mods loaded on a clean save.  Backups are your friend.

     

    The next issue is where in your script do you make the changes?

     

    The Properties go at the top with the other Properties already declared. Only since all the properties in the original script have already been declared we do not want to declare them again.  The first thing you do is remove all the original Properties in the script.  If you miss any don't worry, the compiler will see them and tell you what needs removing.  Then we need to add our Properties, the Ability Spells we are adding and the Boolean and the Hotkey.

    Spell Property Vain01WerewolfLvl55AndBelowAbility auto ;Vain01
    Spell Property Vain01WerewolfLvl60AndBelowAbility auto ;Vain01
    Spell Property Vain01WerewolfLvl65AndBelowAbility auto ;Vain01
    Spell Property Vain01WerewolfLvl70AndBelowAbility auto ;Vain01
    Spell Property Vain01WerewolfLvl75AndBelowAbility auto ;Vain01
    Spell Property Vain01WerewolfLvl80AndBelowAbility auto ;Vain01
    Spell Property Vain01WerewolfLvl85AndBelowAbility auto ;Vain01
    Spell Property Vain01WerewolfLvl90AndBelowAbility auto ;Vain01
    Spell Property Vain01WerewolfLvl95AndBelowAbility auto ;Vain01
    Spell Property Vain01WerewolfLvl99AndOverAbility auto ;Vain01

    But now that we've added the Properties for them we have to tell the game when to give them to the player.  It's easy for the Ability Spells.  The game gives the PlayerWerewolfLvl10-50AndBelow/AboveAbility to the player and all we have to do is add to this section in the script.  The game also removes these spells at the end of the transformation, so be sure to add them to that section as well.  Make sure your syntax is correct, it's largely self explanatory in the respective sections.

    Adding to the player *note - these are only the lines I edited, don't forget to begin and end your if statements!

    elseif (playerLevel <= 50) ;Vain01
            Game.GetPlayer().AddSpell(PlayerWerewolfLvl50AndOverAbility, false) ;Vain01
       elseif (playerLevel <= 55) ;Vain01
            Game.GetPlayer().AddSpell(Vain01WerewolfLvl55AndBelowAbility, false) ;Vain01
        elseif (playerLevel <= 60) ;Vain01
            Game.GetPlayer().AddSpell(Vain01WerewolfLvl60AndBelowAbility, false) ;Vain01
        elseif (playerLevel <= 65) ;Vain01
            Game.GetPlayer().AddSpell(Vain01WerewolfLvl65AndBelowAbility, false) ;Vain01
        elseif (playerLevel <= 70) ;Vain01
            Game.GetPlayer().AddSpell(Vain01WerewolfLvl70AndBelowAbility, false) ;Vain01
        elseif (playerLevel <= 75) ;Vain01
            Game.GetPlayer().AddSpell(Vain01WerewolfLvl75AndBelowAbility, false) ;Vain01
        elseif (playerLevel <= 80) ;Vain01
            Game.GetPlayer().AddSpell(Vain01WerewolfLvl80AndBelowAbility, false) ;Vain01
        elseif (playerLevel <= 85) ;Vain01
            Game.GetPlayer().AddSpell(Vain01WerewolfLvl85AndBelowAbility, false) ;Vain01
        elseif (playerLevel <= 90) ;Vain01
            Game.GetPlayer().AddSpell(Vain01WerewolfLvl90AndBelowAbility, false) ;Vain01
        elseif (playerLevel <= 95) ;Vain01
            Game.GetPlayer().AddSpell(Vain01WerewolfLvl95AndBelowAbility, false) ;Vain01
        else
            Game.GetPlayer().AddSpell(Vain01WerewolfLvl99AndOverAbility, false) ;Vain01

    Removing from the player

        Game.GetPlayer().RemoveSpell(Vain01WerewolfLvl55AndBelowAbility);Vain01
        Game.GetPlayer().RemoveSpell(Vain01WerewolfLvl60AndBelowAbility);Vain01
        Game.GetPlayer().RemoveSpell(Vain01WerewolfLvl65AndBelowAbility);Vain01
        Game.GetPlayer().RemoveSpell(Vain01WerewolfLvl70AndBelowAbility);Vain01
        Game.GetPlayer().RemoveSpell(Vain01WerewolfLvl75AndBelowAbility);Vain01
        Game.GetPlayer().RemoveSpell(Vain01WerewolfLvl80AndBelowAbility);Vain01
        Game.GetPlayer().RemoveSpell(Vain01WerewolfLvl85AndBelowAbility);Vain01
        Game.GetPlayer().RemoveSpell(Vain01WerewolfLvl90AndBelowAbility);Vain01 
        Game.GetPlayer().RemoveSpell(Vain01WerewolfLvl95AndBelowAbility);Vain01
        Game.GetPlayer().RemoveSpell(Vain01WerewolfLvl99AndOverAbility);Vain01

    :smarty:Smarty Says: It is also very helpful when editing such a large script (or any script) to mark your modifications with your modder prefix.  Don't have one? Make one.

     

    Mine is Vain01.  So on a line above and below or on the same line I edit (after the edit) I add ;Vain01.  The semi-colon lets the script know this is a comment and it will not be executed with the rest of the script.

     

     

    That's the easy part.  But we only want the game to look for the hotkey input while you are in Beast Form.  The easiest way to do that is during an Update Event.  Yay for us the original script already has one!  I don't know if it matters where in the event our modification is added but I added it after the first IF statement but before the IF's governing what quest stage is being executed.

     

    Now compile.  If you do not compile your script the Creation Kit will not be able to see it so you can add it to the PlayerWerewolfChangeQuest.

     

    Now that we've compiled and are ready to go, open the PlayerWerewolfChangeQuest and navigate to the Scripts tab.  Add our new script to it.  The script is already on there but it has changed!  Select the script's properties and Auto-Fill them - Most of the Properties will not fill and one will fill that you don't want filled.  Compare the two scripts (original vs altered) until they match exactly and be sure to enter in the correct data for the Properties we added.  Remove the old script.  Don't forget to hit OK before closing the quest window.
     
    Screenshot of the original script (ignore the unfilled Dawnguard script data - does not apply to the vanilla version of the script used here)
     
    Congratulations, everything now works and you can leave Beast Form at will by holding the F key now!
     
    Now I just have to create a permanent power for unlimited transformations! 

    How I'm going to do it -
    Ring of Hircine.  Grants unlimited transformations when equipped.
     
    Script to grant you the ability to transform at will - 

    Scriptname Vain01RingScript extends ObjectReference  
    
    Spell Property Vain01RingPower auto
    Quest Property CompanionsCentralQuest auto
     
    Event OnEquipped(Actor akActor)
    if (akActor == Game.GetPlayer() && (CompanionsCentralQuest as CompanionsHousekeepingScript).PlayerHasBeastBlood)
    Game.GetPlayer().AddSpell(Vain01RingPower, false)
    endif
    EndEvent

    Duplicated and renamed the following spells used... 

    DA05HircinesRingMagicEffect - Magic Effect
    WerewolfChangeRingofHircine - Spell
    DA05HricinesRingEnchantment - Enchantment

  16. if I were more familiar with dungeon keeper than I might be able to be the half retarded cousin helping with this.  As it is... I dunno what some things mean D:

    Like what's the mining process your referring to that would be hard.

    Making an NPC that will spawn and come attack something doesn't seem to difficult, bandits do that to me all the time.

    Is what they're attacking a destroyable object and not another NPC or the player?

    What does spawning room mean?  Places that NPCs of a specific type appear or a place they return to when killed or a place you can make more of them?

    What do you mean by change terrain like the player can and as for issuing orders... NPC's will behave how their programmed.  If you want an intelligent enemy AI that responds adaptively... I'm not sure this game can give that to you.

    Making different rooms like a training room, lair, or hatchery sounds doable.  Can you elaborate on those?

    Breaking through walls to open up new rooms also sounds possible.

     

    (a lot of this is reminiscent of Minecraft and related genre games)

     

    For those with more scripting and modding knowledge I would ask if this project would be too much for the Skyrim engine to handle.

  17. I'm no wizard but you may need to look at the delivery quest and the script a little more.  Something has to tie the note being delivered to the script so that the game knows to give that specific note to the player.

     

    The script looks rather long to me.

     

    You are creating a duplicate of the script and renaming it and stuff so that it doesn't interfere with the Mythic Dawn quest?

     

    You're using the WICourierScript?  It says it's extending a quest conditional so you'd need to have it tied to a quest... perhaps you could show us your script?  I'm not amazing at this but I know a little.

     

    This function here looks like what you're trying to do - 

    function GiveItemsToPlayer()
    pWICourierItemCount.SetValue(0)
    pCourierContainer.RemoveAllItems(Game.GetPlayer())
    WICourierItemsAddedMsg.Show()
    EndFunction

     

    From previous experience those pCourier things look like globals.  That have been previously declared in the script - 

    GlobalVariable Property pWICourierItemCount Auto

    ObjectReference Property pCourierContainer  Auto

     

     

    One's a global one's an object reference and that's about all I know about it...

    And there's that WICourier quest with all the dialogue in it...

     

    And that's not just using the one script, it's using QF_WICourier_00039F82 too.

     

    And thus concludes the extent of my knowledge!

    Try Papyrus 101 forum - there's loads of stuff in there.

  18. Oo ooo ooo!!!! I did something like this!  Not really, but close!

     

    First off do the following!

     

    Enable Papyrus Logging - add to SkyrimEditor.ini Papyrus section

    bEnableLogging = 1
    bEnableTrace = 1
    bLoadDebugInformation = 1


     
    Enable the use of the Dawnguard master file by the Creation Kit - add to the SkyrimEditor.ini General section

    bAllowMultipleMasterLoads=1


    Also add all the masters you want to be using ordered by release date in the Archive section.  This line should already exist, we are simply elaborating on what is already there.  You may need to add the DLC bsa files to the sArchiveList as well - I did.

    sResourceArchiveList2=Skyrim - Shaders.bsa, Update.bsa, Dawnguard.bsa, Hearthfire.bsa, Dragonborn.bsa

     

    That should help lots.

     

     

    Also - move the Dawnguard scripts from the Dawnguard folder into the Scripts folder.

    The directory is in your Skyrim directory >Data\Scripts\Source\Dawnguard

    You want to move all the files from the Dawnguard folder to the Source folder (the CK cannot edit scripts that are in a subfolder of the Source folder - is stupid).

     

    I also created a backup of my entire Scripts folder so that if I screw up, I can just copy/paste my way to a nonbroken game because editing stuff in here can break your installation of Skyrim (and verifying the Skyrim cache doesn't fix it, you have to verify the CK's cache).

  19. Spicy Split Pea Soup

     

    Combine in large saucepan:

    5 cups chicken broth or bouillon

    5 cups water

    1 pound dried split peas or lentils

    Heat to boiling, Turn off heat, Cover and let stand 1 hour (omit this step if using lentils)

    Reheat and simmer over low heat 45 minutes

     

    Sauté in skillet over medium heat:

    2 Tablespoons butter or margarine

    ½ cup chopped onion

    1 clove garlic, finely chopped (minced)

    1 Tablespoon curry powder

    1 teaspoon crushed or ¾ teaspoon ground coriander seeds

    ¼ teaspoon crushed red pepper or cayenne powder

    1 teaspoon salt (omit salt if using bouillon until you taste)

    Stir-fry about 7 minutes

    Stir spice mixture into split peas

    Cover and cook over low heat for 20 minutes

     

    Optional

    • Cool slightly.  Puree 2 cups of the soup in covered blender, holding lid partially ajar to let steam escape.  Repeat until all is pureed OR cook longer until peas disintegrate.
    • Stir in Â½ cup light cream or milk or almond/rice milk.
    • Can be thickened with flour or bean flour mixed with cold water in jar, shaken until blended, then added to soup, stirring until smooth and desired thickness.
×
×
  • Create New...