Get your ammo back. I hate the fact that I have to buy a stack of throwing axes that disentegrate the first time I use them. Must be made of paper and aluminum I guess.

Anyway I wrote a script to allow you to retrieve the ones that hit from the body of the thing you're hitting. Granting that you kill it.

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
}

Anyway the script with instructions built in:


//::///////////////////////////////////////////////
//:: 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;
}