Jump to content

rickerhk

Premium Member
  • Posts

    1814
  • Joined

  • Last visited

Posts posted by rickerhk

  1. Make sure the box on the NPC 'Can be all races' is ticked.

    You may need to start a new game to test this afterward because I've found this setting to be baked in the save.

    Make sure you are running the function on the REFiD:

    MyNPCREF.Matchrace Player

    This is the the way Dad's race is matched to the player in FO3, so you're on the right track.

  2. I'm assuming you made an activator using the static model. On the script for the door, in the 'On Activate' block, Activate another container in the Cell, or a remote cell. Do not activate the door itself.


    The Footlocker01Empty container works well for remote containers.


    This is an example of the 'on activate' block of your dlc04shackcabinet01door:



    BEGIN ONActivate Player
    MYRemoteContainerREF.Activate Player
    END

  3. What I do is place an Xmarker in the Geck somewhere, with a RefID. Then when I need it, I move the xmarker to where I need it, wait a couple frames, then do whatever I need with it. When done, I just leave it where it is till I need it again. An Xmarker placed in the Geck is persistent so it will always be available. A spawned xmarker won't be persistent. I think this may be where the CTD are coming from.

     

    MyXMarkerREF.MoveTo Ralph ;then wait a couple frames
    MyXMarkerREF.Playsound3D TSo
    You know you can get the same effect by just doing this:
    Ralph.Playsound3d TSo
  4. In our mod we have a computer named Maria. The computer itself is a Talking Activator with this script on it (simplified here):




    scn PBrazilPQSQ1MariaScript

    BEGIN OnActivate

    SetTalkingActivatorActor PBrazilPQSQ1MariaREF
    Activate

    END



    PBrazilPQSQ1MariaREF is an NPC in another cell. All the dialog has the condition GetIsID on the NPC object. The 'No low level processing' box on the NPC is unchecked.

    Also, the 'voicetype' in the TA is left as 'NONE'

    We have four of this type of TA setup.


  5. I would start with changing the line:
    Begin OnTrigger Player

    to

    Begin OnTriggerEnter Player
    the 'OnTrigger' block type runs every frame that the player is in the trigger. So the part after the 'else' is running every frame. May be a problem if 'enableplayercontrols' runs every frame.
    'ONTriggerEnter' block type only runs one frame when entered by the player
  6.  

     

    I managed to accomplish what I need by using the GetSecondsPassed and adjusting it to the time scale. This worked out better since it doesn't have to run faster for people that use the default timescale of 30, and it's more accurate since the script is not always processed exactly every 5 seconds (the default process time). To help debug the script, I set some stuff to output things to the console and noticed the script processing time would vary by up to 0.1 seconds, which isn't much, but over time would add up to a significant error. The only down side is that more in-game time will pass for people with higher timescales before things update.

     

    You should probably leave fQuestDelayTime alone. That set's the default quest delay for every quest in the game.

     

    I can't find the page on the GECK Wiki where it gave an example using fQuestDelayTime, but the link it gave for help on the fQuestDelayTime pointed to the Elder Scrolls Construction Set Wiki, which says:

     

    fQuestDelayTime is a special float variable used by quest scripts to determine how often the script should run.

     

    It must be declared in each quest script that you want to use it in, and can be set like any other variable (set fQuestDelayTime to .01).

     

    The variable unit is in seconds, so if you set it to 1 the script will run once every second, 0.5 will run twice a second (every half second), etc. but will never run more than once a frame.

     

    If fQuestDelayTime is 0 (or undeclared) the script will run every 5 seconds (default value).

     

     

    It appears this is no longer used in the GECK and is replaced by the SetQuestDelay instead.

     

    I misread it and thought it was a gamesetting rather than a quest variable. I've never seen that used in FO3 or FNV. I've always used setquestdelay.

    On this page: https://geck.technodeep.net/index.php/Special_Variables

     

  7. You realize that this NPC script runs every frame, so you are applying the script package 60 times per second if you are running at 60fps and probably locking up the AI.


    Try:




    If (HasBeenHired == 1)
    if (ALAmicusREF.GetIsCurrentPackage ALAmicusSandBox == 1)
    ALAmicusREF.removescriptpackage ALAmicusSandBox
    endif
    endif


    If (HasBeenHired == 0)
    if (ALAmicusREF.GetIsCurrentPackage ALAmicusSandBox == 0)
    ALAmicusREF.addscriptpackage ALAmicusSandBox
    endif
    endif



    Also the armor is being added every frame. Put another 'DoOnce2' on that section, or some other check, like 'GetItemCount'


    Edit: And what madmongo said - it's better to avoid scriptpackages except for very short times - when the player is not going to be exiting the cell where the NPC is located. For the sandbox package, it will be ok, but for the follower packages, you should place them on the NPC object.

  8. I actually tested this little bit the other day - actors ('no low level processing' flag unchecked) that have a follow package targeting the player are 'dragged through' the portal on just the player's activation of the portal. So you have to change their package to wait outside, in the same frame (or before) the player activates the portal.


    I'm assuming you don't want to put a script on every door in the game :)


    It sounds simple but it will probably get complicated fast. The only starting point at the moment that I can think of is a script on a token in the player's inventory, with 'GetcrosshairREF' as the basis of a script to detect when the player is targeting a portal, and changing the followers package based on that.
  9. On the NPC/Creature object, the first package from the top of the list, that has true conditions, will be the one in effect. Actors evaluate their packages periodically - every 15 seconds? If no packages have true conditions then the actor will just stand there by default, unless they are in combat. So if you want a package to take effect right away, set the conditions for the package and do the evp function on the actor - ActorREF.evp - http://geck.bethsoft.com/index.php?title=EvaluatePackage.

    Removescriptpackage is only used for addscriptpackage like you found out.
  10. Does your actor effect record have an area and a small duration?




    From what I can tell, your scripts should work.


    The if/else structure is just an optimization to avoid checking an expression for zero.




    if (GetInFaction ProjectBrazilVault18EnclavePatriot == 1)
    else
    return
    endif


    is the same as:




    if (GetInFaction ProjectBrazilVault18EnclavePatriot == 1)
    ;do nothing
    else
    return
    endif


    and it's faster than:




    if (GetInFaction ProjectBrazilVault18EnclavePatriot == 0)
    return
    endif



  11. If you don't want to use NVSE, use a 'touch' spell (actor effect) with a large radius like 5000 or so, that also ignores LOS. That way the scripteffectstart block runs on every actor and you can do stuff to them. You have a quest script that bouces the spell off the player every few seconds to scan the cell. I call them 'radar' effects. If you want to see examples I have on in my wendy gilbert mod RHKWendyCBRadarEffect, and I'm using them in Project Brazil - PBrazilEncSTVRadarEffect. set the flags on the base effect to self, touch, no mag, painless, no hit effect. On the actor effect, 'force touch explode' ignore LOS'.




    scn PBrazilCH1STVRadarEffectScript


    BEGIN ScripteffectStart


    if (IsActor)
    if (GetDead) || (GetDisabled)
    return
    else
    if (GetInFaction ProjectBrazilVault18EnclavePatriot == 1)
    else
    return
    endif
    if (GetIsReference PlayerREF == 1)
    return
    endif
    set PBrazilCH1Save.iCH1PatriotAlive to PBrazilCH1Save.iCH1PatriotAlive + 1
    endif
    endif


    END






    scn PBrazilCH1SaveQuestScript

    short iCH1PatriotAlive ;roll call of live ENC during battle
    short iEnableRadar
    short iCH1STVBattleDone
    short iCH1BraggRevive ;flag to revive Bragg once during STV (if no limbs missing)
    float iCH1BraggReviveTimer
    short iCH1HYDVSecControl ;package flag for remaining V-sec to follow player to the atrium
    short iFailOnce

    ;Quest delay 5 seconds
    ;Bounce a touch spell off the player to detect Enclave that are alive. The Base Effect script is PBrazilCH1STVRadarEffectScript
    BEGIN GameMode

    if (iEnableRadar == 1)
    if (Player.IsSpellTarget PBrazilEncSTVRadarEffect == 1)
    else
    set iCH1PatriotAlive to 0
    Player.cios PBrazilEncSTVRadarEffect
    set iEnableRadar to 2
    endif
    elseif (iEnableRadar == 2) ;will be here on the next loop in 5 seconds
    if (iCH1PatriotAlive) || (iCH1BraggRevive < 4) ;Not done with battle, Bragg not dead-dead
    set iEnableRadar to 1
    else
    set iCH1STVBattleDone to 1 ;No ENC responded
    endif
    endif



    END

  12. I read somewhere that Oblivion Lip files will work in place of Skyrim files using that method as well. (Added to the "Creating Mods" article.)

     

    -Dubious-

    You can use the old Oblivion construction kit to make lip files, but the lip movement is better if you use the Skyrim file.

  13. If you want to regenerate health, you use "restoreactorvalue". Modactorvalue will increase your permanent health value but not heal the damage. http://geck.bethsoft.com/index.php?title=RestoreActorValue


    You put this script on the armor itself and don't bother with object effects.



    scn HealthRegenerateScript


    ref rContainer
    short iMaxHealth
    short iCurrentHealth
    float fRegenInterval


    BEGIN GameMode

    if (fRegenInterval > 0)
    set fRegenInterval to fRegenInterval - GetSecondsPassed
    else
    set rContainer to GetContainer ;get the actor wearing this armor
    if (rContainer) && (rContainer == Player)
    set iMaxHealth to GetPermanentActorValue Health
    set iCurrentHealth to GetActorValue Health
    if (iCurrentHealth < iMaxHealth)
    RestoreActorValue Health 10
    set fRegenInterval to 1 ;these two values mean 10 HP per second
    endif
    endif
    endif


    END

×
×
  • Create New...