I realised that there was never a formal announcement here to read up: The Catara NWN server is offline for quite some time now, due to time constraints. I might revive it someday, but it is pretty unlikely. If anyone wants to use our custom classes or tools, ping me on twitter (@jollyorc) and we can see what we can do for you! In the meantime, I do recommend The World of Avlis: https://avlis.org/
Horses!
  • ok, I intend to add horses to Catara.
    Ridable ones!
    Which are persistant NPCs, so people will be able to keep them. Of course, that means we'll need stables and such too, but that's the next step.
    First step will be to make the Bioware horse scripts work with our P-NPC system. For this, we'll basically need to hook into the MountHorse() and DismountHorse() scripts.

    MountHorse()

    alters the PCs attributes and appearance so it looks like he's riding a horse, saves the horses name, inventory and appearance onto some variables on the PCs hide, then destroys the horse NPC.
    This needs to be changed&simplified: Store the whole horse NPC into our db, referenced to the PC object, then destroy it


    DismountHorse()

    Changes the PCs appearance and stats back to their originals, then fetches the horses name, looks & inventory, then recreates a new horse by blueprint, altering it so that it looks like the original one.
    we want to do this instead: Fetch the old horse NPC from the db and spawn it back in.



    Then there's the thing with the PC hide: The Bioware horse system uses a different PC hide, tries to spawn it onto the PC, etcpp. Hilarity ensues, at least a confused player. This should be changed to use the Catara/CoPaP PC hide.
    That should be basically be all. Of course there is finetuning, placing "no horse here" triggers and variables across the server, add in stables and horse traders, make the guards spot and call out people who ride into town...  but that's really just that: Details.
    Any volunteers? :)
  • Awesome! :)) Sadly, I don't know much about scripting. All I can volunteer here for is to eventually build some stables and such.
  • copied out from x3_inc_horse:
    HOW TO GET THE MOST FROM THIS HORSE SCRIPT:

    ===========================================



    This script has been setup to simply work with the default horses but, some effort was made to provide you with some simple methods to hook your own mounts, mounting scripts, etc. into this script.



    [HORSE BLUEPRINT VARIABLES] ===========================



    The following variables can be set on the BLUEPRINT of a creature to extend this mounting system.   These scripts could be used to add database functionality, or extend the system however, you like.



    bX3_IS_MOUNT = integer that should be set to 1 if this is a custom blueprint mount that for some reason the script indicates is not a mount.



    X3_HORSE_PREMOUNT_SCRIPT = script to fire before the horse is mounted.  If this script determines it cannot mount then it will set X3_HORSE_NOMOUNT to TRUE on the mount.  You can use a script like this to create support for saddlebags or to use this to extend the mounting system.  This will be executed by the rider and the variable oX3_TempHorse will be set pointing to the horse so that the custom script knows which horse this relates to.



    X3_HORSE_POSTMOUNT_SCRIPT = can be set to a script that can be fired after this mount is mounted.  This may be useful for adding things like feats and other after mounting needs. If this script does not exist then the standard Speed, Skill Decreases, Mounted Archery Adjustments, etc. will be applied.  If you want your own post mount script then it is important to note you will have to apply these modifiers if you also want them to be used within your own script.  The horse that was mounted will be referenced by oX3_TempHorse as stored on the Rider. If you use such a custom hook script make sure to set bX3_IS_MOUNTED to TRUE by using the SetSkinInt() function from x3_inc_skin. on the rider after they mount.   This is required in some cases for the dismount radial to work. (mainly when working with custom mounts)



    X3_HORSE_PREDISMOUNT_SCRIPT = can be set to a script that needs to be executed before the dismount portion continues.  If X3_HORSE_NODISMOUNT is set to TRUE then the horse dismount will be aborted.



    X3_HORSE_POSTDISMOUNT_SCRIPT = can be set to a script to be executed after dismount to reverse steps that may have occurred with a POSTMOUNT script such as adding feats.  This script could be used to remove feats.



    It is possible you might want to add a new horse/mount type that does not fit neatly into the appearance.2da or tails.2da with the other horse types. The following variables if set to any number greater than 0 will override the default settings and use what you specifiy instead.



    X3_HORSE_NULL_APPEARANCE = the appearance to use when scaling the horse for the mounting animation.



    X3_HORSE_TAIL = the tail to use with the tails.2da that defines this horse.



    X3_HORSE_FOOTSTEP = the footstep number to use when this horse is mounted.



    X3_HORSE_MOUNT_DURATION = is the duration in seconds 0.0f that the mount animation should take with this horse.  This only needs to be set if the mounting animation for this blueprint is faster or longer than the default animations.



    X3_HORSE_MOUNT_SPEED = is the mount speed increase or decrease that should be used with this mount.  If the value is 0 then it will use the HORSE_DEFAULT_SPEED_INCREASE constant value.



    X3_HORSE_DISMOUNT_DURATION = is the duration in seconds 0.0f that the dis- mount animation should take with this hores.  This only needs to be set if the dismounting animation for this blueprint is faster or longer than the default animations.



    X3_HORSE_RESTRICT_race = is a variable that set to TRUE this horse cannot be mounted by the specified race.  Supported races are ELF, HUMAN, HALFELF, DWARF, HALFORC, HALFLING, and GNOME, CUSTOM# = racial type number.



    X3_CUSTOM_RACE_APPEARANCE = a variable to set on a rider if they use a custom racial appearance.  This value should be set to what appearance number they use from appearance.2da.   This will prevent custom races from being denied mounting rights due to the script thinking the rider is shape shifted.



    X3_CUSTOM_RACE_MOUNTED_PHENO = This variable should be used on the rider if they should use a special phenotype when mounted.  This is provided to support custom races.



    X3_CUSTOM_RACE_JOUST_PHENO = This variable should be used on the rider if they need a special phenotype when mounted in joust mode.



    X3_CUSTOM_RACE_PHENOTYPE = This variable should be used on the rider if they need a special phenotype when not mounted.



    X3_CUSTOM_RACE_MOUNTED_APPEARANCE = a variable to set on the rider to indicate which appearance they should use when mounted.



    X3_HORSE_OWNER_TAG = a string that can be set on the horse that will tell it to Add itself as a henchman to an NPC with the specified tag.



    X3_HORSE_NOT_RIDEABLE_OWNER = if this integer is set to 1 on the Horse then Mount will not be useable and the error it will return if asked is that it is NOT rideable due to it being owned by someone else.  This is useful if you want horses around that the PCs and Henchmen cannot mount for reasons such as they are owned by a store, etc.



    bX3_IS_MOUNT = a variable that should be set to TRUE if a mount is added as a henchman but, is still mountable.



    X3_NO_MOUNT_ANIMATE = if this integer is set to 1 then this mount does not EVER animate mounting or dismounting.



    X3_TOTAL_MOUNT_ANIMATION_DELAY = a variable containing a time lot indicating how much time the routine has before it needs to be finished. it is used for the sake of synchronizing animation and the process running in the background, exclusively used in mounting animation portion of the HorseMount() routine, but can be used elsewhere. Note, that the variable is artificially set even in case no animation is desired so that the code doesnt happen instantly. It is not meant to be changed, unless something bad is happening timing-wise. The value is precalculated and in our particular case it is supposed to hold the total animation length.



    The following make it easier to implement existing mount support systems in conjunction with this one.



    X3_HORSE_SCRIPT_MOUNT = Script to call for mounting instead of using the default one called by the horse menu feat.  This still checks to make sure mounting in the area is legal first. This is intended for making the radial menus do something different just for this horse and is not intended to alter the HorseMount(), HorseDismount(), etc. functions.   There are already POSTMOUNT, POSTDISMOUNT, PREMOUNT, and PREDISMOUNT hooks which make that functionality possible so, that is not what this variable is for.



    X3_HORSE_SCRIPT_DISMOUNT = Script to call for dismounting instead of using the default one called by the horse menu feat. This is intended for making the radial menus do something different just for this horse and is not intended to alter the HorseMount(), HorseDismount(), etc. functions.   There are already POSTMOUNT, POSTDISMOUNT, PREMOUNT, and PREDISMOUNT hooks which make that functionality possible so, that is not what this variable is for.



    X3_HORSE_SCRIPT_ASSIGN = Script to call for assign mount instead of using the default one called by the horse menu feat. This is intended for making the radial menus do something different just for this horse and is not intended to alter the HorseMount(), HorseDismount(), etc. functions.   There are already POSTMOUNT, POSTDISMOUNT, PREMOUNT, and PREDISMOUNT hooks which make that functionality possible so, that is not what this variable is for.



    bX3_HAS_SADDLEBAGS = Integer that if set to 1 on the mount will indicate the horse has saddle bags.  It will support inventory control if it is enabled (NOT: by default).  You will also want to set the dialog X3_DLG_SADDLEBAG on the horse blueprint.  Or, create your own dialog that handles what the saddlebags one does.  You will only be able to access saddlebags of associates in your party.
  • [AREA RELATED VARIABLES TO SET] ===============================



    X3_NO_HORSES = Horses not allowed in this area



    X3_NO_MOUNTING = Horses may not be ridden in this area and anyone attempting to do so should be forcibly dismounted.



    X3_HITCHING_POST = if a placeable or waypoint in the area a person was in before entering a new area has a tag of this then it will move any horses to this object and set them to STAND_GUARD mode.



    X3_MOUNT_OK_EXCEPTION = is an integer that if set to 1 on this area will override the external and underground restrictions for this area that may be set module wide.



    fX3_MOUNT_MULTIPLE = is a floating point value that is multiplied times all delays if it exists on the area.   It can be used to make an area perform the mounting animations at a different speed if you have really busy areas and want to make the animation faster or slower.   If this is not defined then it will always be a value of 1.0.   If it is set to 0.5 then delays will be shortened by half.   If it is set to 2.0 then the delays will take 200% longer.   This is something a module builder will need to be aware of and can adjust. NOTE: This can be set on the PC as well and whichever number is larger is the one that will be used.



    fX3_DISMOUNT_MULTIPLE = is similar to fX3_MOUNT_MULTIPLE and should only be supplied if you want the dismount to use a different speed than the mount multiple.   It can be set on the area or on the PC.   The PC will take priority over the area.



    bX3_MOUNT_NO_ZAXIS = value to set to TRUE or 1 on the module, PC, or area to indicate when calculating the proper mounting location you do not want the Z Axis to be included in the measurement.  This has been found to work well in areas where you do not want the Z axis to be measured in terms of whether to perform the mounting animation or not.



    X3_ABORT_WHEN_STUCK = if set to TRUE, distance between player and horse is recorded and checked in each cycle against the current one, when moving to a horse during the mounting procedure. Should the two ever be equal, meaning that the player got stuck on his way to horse, the mounting procedure will be terminated. This is handy in cases when horses are behind obstacles that are hard to overcome like walls, but the timer that ensures that rider can mount his horse even in difficult terrain, would eventually force-mount the potential rider, which could seem like an illogical act. This doesn't need to be used when using X3_HORSE_ACT_VS_DELAY option, where the timer starts ticking only after the player gets as close as 1.5m to a horse. The switch can be set on an area or horses (ie. using an OnEnter script of a trigger).



    [MODULE RELATED VARIABLES TO SET]

    =================================



    X3_HORSE_PALADIN_USE_PHB = integer that if set to 1 on the module object will cause the script to use paladin mount summoning durations as specified in the Player's Handbook 3.5 edition rather than just defaulting to 24 hours.



    X3_HORSE_DISABLE_SPEED = integer that if set to 1 on the module object will indicate you do not want a speed increase applied when a person mounts.



    X3_HORSE_DISABLE_SKILL = integer that if set to 1 on the module object will indicate you do not want the skill decreases to be applied when a person mounts.



    X3_HORSE_ENABLE_ACBOOST = integer that if set to 1 on the module object will indicate that you want the PCs AC to be increased if need be to at least match that of the horse that is being mounted.



    X3_HORSE_ENABLE_HPBOOST = integer that if set to 1 on the module object will indicate that you want the PCs Hit Points to  be increased by half of the hit points of the mount when it is mounted.



    X3_NO_MOUNT_COMMANDABLE = integer that if set to 1 on the module object will indicate that you do not want the SetCommandable() commands to be used with the module.



    X3_NO_MOUNTED_COMBAT_FEAT = integer that if set to 1 on the module object will indicate that you do not want the special code added to Bioware scripts to try to support Mounted Combat close to how it is in Player's Handbook to be used.



    X3_ENABLE_MOUNT_DAMAGE = integer that if set to 1 will attempt to transfer some damage to the mount when a rider dismounts if damage occurred while they were mounted.



    X3_ENABLE_MOUNT_DB = integer that if set to 1 will enable database and persistent world support with this script.   You will want to modify the HORSE_Support functions related to the database so, that they write and read properly however you have the database setup in your module.  You will also want to plan on using something like the x3_mod_def_hb script for your module heartbeat script if you are going to use the database.   This is not used on modules by default.



    X3_NO_SHAPESHIFT_SPELL_CHECK = integer that if set to 1 on the module will prevent the script from checking to see if a shapeshifted spell is targetted on a mounted creature.   If this variable is set to 1 then the x2_inc_spellhook scripts will work exactly like they did before horses were introduced with no concern whether the target is mounted or not.



    X3_MOUNT_NO_REST_DISMOUNT = integer that if set to 1 on the module will make it so, you are able to rest while mounted.



    X3_MOUNT_NO_REST_DESPAWN = integer that if set to 1 on the module will make it so, your paladin mount is not despawned when you rest and adheres strictly to his summoned duration.   If time is advanced by resting then it is still possible it will despawn.



    X3_MOUNTS_EXTERNAL_ONLY = integer that if set to 1 on the module will make it so mounts can only be ridden in external areas.  There is an exception variable that can be set on an area to override this.



    X3_MOUNTS_NO_UNDERGROUND = integer that if set to 1 on the module will make it so mounts cannot be ridden in underground areas.  There is an exception variable that can be set on an area to override this.



    X3_HORSE_ENABLE_SADDLEBAGS = integer that if set to 1 on the module will enable inventory support for the horse.  NOTE: If you want it to use a quick non-database method for storing the inventory place a waypoint with the tag X3_HORSE_INVENTORY_STORAGE somewhere in an area that a PC can never get to. If this waypoint does not exist then it will assume that the database is to be used.   If you are using a database it is adviseable that you change the support functions because, they use the standard databases and it will often prove slower than you may like.



    X3_SADDLEBAG_DATABASE = string to set to the name of the database to use for storing saddlebag inventory.   If no name is specified it will use the module tag and a small modifier.



    X3_HORSE_NO_HENCHMAN_INCREASE = integer that if set to 1 on the module will prevent the henchmen from being increased to make room for the horse.



    X3_HORSE_MAX_HENCHMEN = integer to set on the module to indicate the maximum number of henchmen to allow it to be increased to in order to make room for horses.   By default there is no maximum.



    X3_HORSE_NO_CORPSES = integer to set on the module to 1 to indicate you do not want lootable horse corpses created when a mounted PC or NPC dies.



    X3_RESTORE_HENCHMEN_LOCATIONS = integer to set to 1 on the module if you want henchmen's henchmen to be restored to a location near the henchman that is their master when a PC master of the henchman connects.   This is NOT enabled by default to prevent problems with older modules.



    X3_EXTEND_PALMOUNT = string variable that if set on the module object will allow a person to extend this paladin mount script to call other scripts in a daisy chain type situation such as saddle bag handling ones.



    X3_EXTEND_PALDMOUNT = string variable that if set on the module object will allow a person to extend this paladin mount script to call other scripts in a daisy chain type situation such as saddle bag handling ones.



    X3_HORSE_ACT_VS_DELAY = integer to set on the module to 1 to indicate you want the system to use Actions as opposed to delays in some portions of the mounting sequence.  Doing this might provide another way to handle inaccessible horses besides using X3_HORSE_NOT_RIDEABLE_OWNER.   It may result in not being able to access accidentally poorly placed horses due to scripts or other factors but, it may be desired by some module designers so, it has been provided as an option.
  • [ON THE MODULE or THE PLAYER] =============================



    X3_PALMOUNT_SUMMONOVR = string if set on the module or the player (player has priority) it will do all the checks to see if a summon is okay.   Then if this variable is set it will execute the script you define here rather than using the standard summon paladin mount function.  Beware:  If you use this then handling all other aspects of this mount become your responsability.



    fX3_TIMEOUT_TO_MOUNT = value to set on the module or PC to indicate how long the PC/NPC should attempt to move into a proper mounting animation to perform the mounting animation.   When this time is reached if it is still not in position it will instant mount instead and will not animate. If this value is lower than 6.0 or is not set, then the default value of 18.0 will be used.



    fX3_FREQUENCY = frequency of recursive call of the HorseMount() function to try and initiate new pathfinding to the horse everytime until the character reaches the mounting position or until the time limit for mounting is up or unless X3_HORSE_ACT_VS_DELAY is set to TRUE, in which case the actionqueue is not locked and moving towards a horse is interruptable, ie. by clicking. if set larger than 9.0 or less than 1.0 the value defaults to 2.0 seconds.



    bX3_MOUNT_NO_ZAXIS = value to set to TRUE or 1 on the module, PC, or area to indicate when calculating the proper mounting location you do not want the Z Axis to be included in the measurement.  This has been found to work well in areas where you do not want the Z axis to be measured in terms of whether to perform the mounting animation or not.



    [SCRIPT TO OVERRIDE SKIN SYSTEM] ================================



    The skin system is designed to supply the horse radial menus to older characters and it also is used to track some of the information about the state of the PC semi-persistently.   The system is setup in such a way that PRC or HCR or other systems that use skins will still use their own skin as long as they run first.   If the horse system does not detect a skin it will create one. Thus, if it runs before PRC or HCR create their skins there might be a problem. To make this less of an upgrade nightmare the horse script includes support for a hook script.   If PRC, or HCR or other scripting package people create a script named [x3_mod_pre_enter] and make that script add their skin to the PC then this script WILL execute ALWAYS before the horse scripts create their skin.   This means all you need to do is make such a script and have it add your skin and your scripts should function as they did before (EVEN) if the horse scripts execute other aspects before yours.



    [DEBUGGING AND TWEAKING SCRIPTS]

    ================================



    Press ~ in game to bring up console mode.  Type DebugMode 1 and press enter.

    Press ~ in game and this time type dm_runscript scriptname and press enter.

    Press ~ in game and type DebugMode 0 when you want to disable debug mode.

    SCRIPTS:

    x3_fix_horse = use this when the PC is being treated as mounted when it is not

    x3_fix_horseout = use this to make a module not designed with horses in mind only allow horses in outside areas.

    x3_fix_nocmd = set it not to use the SetCommandable with mounting toggle

    x3_fix_act = set to use actions when mounting toggle

    x3_fix_speed100 = mount/dismount speed multiple set to normal 100%

    x3_fix_speed125 = mount/dismount speed multiple set to 1255 (25% slower)

    x3_fix_speed150 = mount/dismount speed multiple set to 150% (50% slower)

    x3_fix_speed200 = mount/dismount speed multiple set to 200% (100% slower)

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!