Player Resource Consortium

Neverwinter Nights => Help => Topic started by: Arbaal on January 02, 2018, 03:01:06 AM

Title: Need little help/suggestion - Ita Admin
Post by: Arbaal on January 02, 2018, 03:01:06 AM
Good Morning!
Just a suggestion. I'm sure someone of you can know the way to help me.

I use prc from several years on my shard and i've completely translated all prc in Italian, adapting something specific for my world.

No problem with scripts, no problem with classes, no problem with nothing.

I've just a problem that i've tried to solve by myself for months, without finding a solution.
It's not a bug.

I would like to edit some strings of codes, some spell scripts to have them behave slightly different but i can't make it work.

Example: Fireball script; i would like to set the caster level cap to 24 instead of 10 and so on with some other spell scripts.

Now, i know that these scripts are in prcspells.hak and i've exported to edit them.
I can edit the nss but until i can't make a ncs of the script, also re-importing into the hak and using the new hak modified, the fireball will continue to do the same things as before.

The PRC compiler does not work on my windows 7. No compiler for nwn seems to work. It starts for a blink of an eye and then shuts down.
I have not an old machine on which i could make it work the compiler.

The first question: is it right? This is the way to edit that spell scripts or are there other ways?
I would like to touch only spell scripts of original nwn spells and not every spell, just a few; then some epic spells.

1- i open the hak
2- i export the spell script (nss and ncs)
4- i re-import into the hak
5- i use the new hak.

Am i missing something?
Do you have a compiler version that works with windows 7 that i can use to produce an ncs?
Are there other ways to do this?
Title: Re: Need little help/suggestion - Ita Admin
Post by: xwarren on January 02, 2018, 03:24:28 PM
I use nwnnsscomp.exe to compile scripts. You can find it in PRC SVN repo or on the Vault:
PRC Neverwinter Script Compiler v2.0 (

You can find usage example in this post: (

I'm sure you will find more if you search the forum for 'nwnnsscomp'

Good luck!
Title: Re: Need little help/suggestion - Ita Admin
Post by: Arbaal on January 02, 2018, 05:53:33 PM
Thank you xwarren. I'm very sorry for make you waste time! I've searched forums before writing but i've used wrong keywords.

Thanks again for your amazing work and all prc team. Your work is the best add to nwn ever made and me and my players are very grateful to this masterpiece.
I will follow the instructions in the compiler usage post :) :) :)
Title: Re: Need little help/suggestion - Ita Admin
Post by: Arbaal on January 05, 2018, 01:03:04 PM
Ok, i've done what we said. I've used the compiler with all prc scripts (inc and all the others) in a folder.
It compiles the script but it finds errors.

Is there a pious soul that explains me how to use the spellhooking function that the prc staff has gently included in their scripts?

This is what i know:
1 - this is a part of the code in the x2_inc_spellhook
it seems to say that if you want you can tell it to execute a script that you create instead of an original script:

Code: [Select]
// Execute a user overridden spell script.
int X2RunUserDefinedSpellScript()
    // See x2_inc_switches for details on this code
    string sScript =  GetModuleOverrideSpellscript();
    if (sScript != "")
        if (GetModuleOverrideSpellScriptFinished() == TRUE)
            return FALSE;
    return TRUE;

// Set the user-specific spell script
void PRCSetUserSpecificSpellScript(string sScript)

// Get the user-specific spell script
string PRCGetUserSpecificSpellScript()

2 - part of the code of nw_s0_fireball (fireball original prc script) for example
it says something about spellhook

Code: [Select]
  Spellcast Hook Code
  Added 2003-06-20 by Georg
  If you want to make changes to all spells,
  check x2_inc_spellhook.nss to find out more


    if (!X2PreSpellCastCode())
    // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell

// End of Spell Cast Hook

3 - the most important: it explains how to use the spellhook function i think
(x2_inc_switches - part of the code about spellhooking)

Code: [Select]
//                          S P E L L S C R I P T S

// Allows the module creator to specify a script that will be run before any spellscript is run
// You can call SetModuleOverrideSpellscript() at the end of the script specified by
// sScriptName. If you call this function this will prevent the original spellscript
// (and all craft item code) from being executed.
// If you do not add this line, the original spellscript and/or crafting code will
// run in addition to your script
void SetModuleOverrideSpellscript(string sScriptName);

Can someone make me an example of how to use that function with prc, without touching the original spell scripts of prc?
I think it's possible but i can't solve by myself
Title: Re: Need little help/suggestion - Ita Admin
Post by: Atalsen on January 26, 2018, 11:22:53 PM
As a recap: the Spellhook script fires before the bulk of the spell script; if the Spellhook script returns false in the X2PreSpellCastCode function, then the origional script will not fire. In this way, you can 'intercept' a spell, do something else with it, and tell the original spell not to fire.

You have to define what script (what name your script will have) to fire for spellhooking, that is where setting the module variable via SetModuleOverrideSpellscript(string sScriptName) comes in. Pick a name like "my_spell_hook" and then use that name when you create your spellhook script. I don't remember off hand if the PRC has a default value set for a spellhooking script name that you can just use without the need to set anything.

I think you know this, and that you just need helm with how the spellhook sript works. If that's not it, then let me know.

Here is an example from my own spellhook script; however, my script compiles the PRC items in it using the NWNTX Loader.exe updated toolset you can find on the NWN vault. Without that you wont' be able to use any PRC includes or functions.

Here is a partial spellhook file example for simply disabling the Continual Flame spell:

Code: [Select]
//:: Name: Spellhook script

This script handles all the spellhooking for various spells


#include "x2_inc_switches"
// allows the use of:
// SetModuleOverrideSpellScriptFinished();
// which will kill the origional spell, if we need it not to run

// Include file for PCR Spell constants
#include "prc_spell_const"

// Include file for PCR Psionic Power constants
#include "psi_power_const"

//:: Functions

void main()

// Gather all useful info about the spell
    object oCaster =  OBJECT_SELF;                  // The caster of the spell is OBJECT_SELF
    object oMagicItem = GetSpellCastItem();         // if an item cast the spell, this function gets that item
    object oTarget =  GetSpellTargetObject();       // returns the targeted object of the spell, if valid
    location locTarget = GetSpellTargetLocation();  // returns the targeted location of the spell, if valid
    int iCasterClass = GetLastSpellCastClass();     // gets the class the PC cast the spell as
    int iCastLevel = GetCasterLevel(OBJECT_SELF);   // gets the level the PC cast the spell as
    int iSpellDC = GetSpellSaveDC();                // gets the DC required to save against the effects of the spell
    int iCasterAlignment = GetAlignmentGoodEvil(OBJECT_SELF);  // Returns the good/neutral/evil constant for the caster

    int iSpell = GetSpellId();                      // returns the SPELL_* constant of the spell cast

    switch (iSpell)
//:: Spells Section

                FloatingTextStringOnCreature(ColorString(C_RED, "The Continual Flame spell is currently disabled."), oCaster, FALSE);

Basically, in the spellhook file you want to
1) Identify the spell via spell ID (GetSpellId())
2) Do something with the spell (script your own spell, call another script, whatever); in my example I play some floating text in the caster.
3) Tell the original spell NOT to fire (via SetModuleOverrideSpellScriptFinished() call)

My example just ends the spell, and doesn't do #2, but for a different fireball you could do this:

        case SPELL_FIREBALL:
                ExecuteScript("my_cust_fireball", OBJECT_SELF);

And then you can write up your own fireball script in the "my_cust_fireball" scritp file.