DMH-Online

Dungeon Masters Helper · Est. 2005

Items Scripts

NWN Script: retrieve_ammo.htm

Author: Danmar
Author Website: Lands of Kray
Script Name: Retrieve Ammunition
Description: This script allows a PC to retrieve ammunition fired at a creature (assuming the creature is killed).
Instructions on Use: As is the script has a 100% chance of every item that hits of being on the body. You can fairly easily change that according to your ideas of how many a player should be getting back by putting a simple change like so around each create statement:

if (d6()<=3)
{
Create statement
}

Script 1 (OnUserDefined):

//::///////////////////////////////////////////////
//:: Name:  Missile weapon respawn
//:: NW_C2_DEFAULTD replacement
//:: Copyright 2002 Dennis Dollins - www.landsofkray.com
//:://////////////////////////////////////////////
/*
    Purpose:
    Uses the On damaged user event to respawn missile
    weapons in the inventory of the attackee.
    Rationale:
    I dislike the fact that an arrow, bolt, bullet
    throwing axe (?!) crumbles and distenigrates
    after a single use.  Bullets are simple chunks
    of stone and/or metal for goodness sake.
    Code:
    Pretty simple.  Each time an object is damaged
    we find out what weapon type damaged it.  If its
    a ranged weapon we check that the object has an
    inventory and then we create an object of the type
    that damaged it in that inventory.  To avoid
    increasing the code I did not include having bullets
    bounce off and be created on the ground nearby or
    at the objects feet.  The risk of an invalid
    location and such outweighed the vermislitude
    in that instance.
    As is this code spawns in a generic aka BW standard
    ammo replacement.  To code the replacement of a
    precise ammo type would require too much specialized
    checking in my opinion increasing the performance hit
    for this addition.
    Your opinion may differ and you can see an example at
    the bottom of the script as to how you might do
    exact replacements.
    How to use aka what files to edit:
    1)Put this script in place of the UserEvent script on
      the NPC's you wish to collect an inventory.
      You could replace/edit the standard user event script
      and then all the npc's including standard ones would
      collect arrows.
    2)Uncomment the signal damaged event in the onspawn
      script for your npcs.  Again you can do this for all
      the standard npc's by editing the standard on
      spawn script.
      Change this:  //SetSpawnInCondition(NW_FLAG_DAMAGED_EVENT);
      to this:   SetSpawnInCondition(NW_FLAG_DAMAGED_EVENT);
*/
//:://////////////////////////////////////////////
//:: Created By: Dennis Dollins
//:: Created On: July 10, 2002
//:: Last Revised: July 11,2002
//:://////////////////////////////////////////////
void main()
{
    // Okay let's get the event that brought us here.
    int nUser = GetUserDefinedEventNumber();
    if(nUser == 1001) //HEARTBEAT
    {
    }
    else if(nUser == 1002) // PERCEIVE
    {
    }
    else if(nUser == 1003) // END OF COMBAT
    {
    }
    else if(nUser == 1004) // ON DIALOGUE
    {
    }
    else if(nUser == 1005) // ATTACKED
    {
    }
    else if(nUser == 1006) // DAMAGED
    {
        // Who did the attacking?
        object Attacker = GetLastDamager();
        // What did they do it with?
        object Weapon = GetLastWeaponUsed(Attacker);
        // What's the base type of the weapon?
        int BaseType = GetBaseItemType(Weapon);
        // If the weapon was ranged and we have an inventory
        // I know most things that get hit should have an inventory
        // but let's check anyway to avoid trying to create
        // something in nothing.  Bag of holding inside portable hole = bad.
        if  (GetWeaponRanged(Weapon)&&GetHasInventory(OBJECT_SELF))
            {
            switch (BaseType)
                {
                    //Not going to comment these as they should be
                    //pretty self evident what each case does.
                    case BASE_ITEM_SHORTBOW:
                        CreateItemOnObject("nw_wamar001",OBJECT_SELF,1);
                    break;
                    case BASE_ITEM_LONGBOW:
                        CreateItemOnObject("nw_wamar001",OBJECT_SELF,1);
                    break;
                    case BASE_ITEM_LIGHTCROSSBOW:
                        CreateItemOnObject("nw_wambo001",OBJECT_SELF,1);
                    break;
                    case BASE_ITEM_HEAVYCROSSBOW:
                        CreateItemOnObject("nw_wambo001",OBJECT_SELF,1);
                    break;
                    case BASE_ITEM_DART:
                        CreateItemOnObject("nw_wthdt001",OBJECT_SELF,1);
                    break;
                    case BASE_ITEM_SLING:
                        CreateItemOnObject("nw_wambu001",OBJECT_SELF,1);
                    break;
                    case BASE_ITEM_SHURIKEN:
                        CreateItemOnObject("nw_wthsh001",OBJECT_SELF,1);
                    break;
                    case BASE_ITEM_THROWINGAXE:
                        CreateItemOnObject("nw_wthax001",OBJECT_SELF,1);
                    break;
                    /*  Below this find example of how to do a little more
                        involved bit of check and replacment but you'll have to
                        supply the blueprints that pertain to your
                        module and items.
                    */
                    /*
                    case BASE_ITEM_SHORTBOW:
                        object CurrentAmmo = GetItemInSlot(INVENTORY_SLOT_ARROWS,OBJECT_SELF);
                        string AmmoTag = GetTag(CurrentAmmo);
                        //I think switch works with strings if not you'll need
                        //to do a buttload of if statements
                        switch (AmmoTag)
                            {
                                // Example tag, your tag would be different
                                case "Arrows_Plus_1"
                                    // Example blueprint ref name, yours would be different.
                                    CreateItemOnObject("nw_wamar003",OBJECT_SELF,1)
                                    break;
                            }
                    */
                }
            }
    }
    else if(nUser == 1007) // DEATH
    {
    }
    else if(nUser == 1008) // DISTURBED
    {
    }
    return;
}
⌂ All Scripts ← PreviousNext → 👁 Category List

All Items Scripts

📄 aquire_time 📄 bead_of_force 📄 book_of_inf_spells 📄 clear_inventory 📄 clear_inventory_002 📄 clear_inventory_003 📄 clear_inventory_004 📄 cursed_items 📄 cursed_items_002 📄 cursed_potion 📄 give_xp 📄 glow_when_mob 📄 healing_belt 📄 helm 📄 hurled_weapons 📄 item_weight 📄 key_rental 📄 lore_items 📄 npc_owners 📄 random_magic 📄 retrieve_ammo 📄 scimitar_of_dancing 📄 scroll_creation 📄 spawn_item 📄 spawn_item_002 📄 spawn_item_004 📄 stone_of_recall 📄 stone_of_recall_002 📄 summon_creature 📄 teleport_item 📄 torch 📄 weapon_upgrade