Noticed you couldn't have throwable
daggers...so I made a lil system...allows for some enchantments as per the
DMG.
relies on the item being created with the same resref/tag (or as close as
possible). item should have "unique power, unlimited uses" set.
Header File
NWScript:
int InString(string sString, string sPattern);
void CreateEquip(object oItem, object oTarget);
int InString(string sString, string sPattern)
{
int iFound;
if ((sPattern == "") || (sString == ""))
{
return FALSE;
}
iFound = FindSubString(sString,sPattern);
if (iFound >= 0)
{
return TRUE;
}
else
{
return FALSE;
}
}
void CreateEquip(object oItem, object oTarget)
{
oItem = CreateItemOnObject(GetTag(oItem), oTarget);
AssignCommand(oTarget, ActionEquipItem(oItem, INVENTORY_SLOT_RIGHTHAND));
}
Main File
NWScript:
#include "throwheader"
void main()
{
object oPC = GetItemActivator();
object oItem = GetItemActivated();
object oTarget = GetItemActivatedTarget();
location lTarget = GetItemActivatedTargetLocation();
string sItemName = GetStringLowerCase(GetName(oItem));
if (GetTag(oItem) == "OtherItems")
{
}
else
{
if( GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,oPC)!= oItem && GetItemInSlot(INVENTORY_SLOT_LEFTHAND,oPC) != oItem)
{
SendMessageToPC(oPC,"You must equip your weapon!");
return;
}
effect eDamage;
effect eExtraDamage;
effect eVisualThrow = EffectBeam(VFX_BEAM_EVIL, oPC, BODY_NODE_HAND);
effect eVisualImpact = EffectVisualEffect(VFX_DUR_LIGHT_RED_5, FALSE);
int nDamage;
int nExtraDamage;
float fIncrement;
float fMaxRange;
int nPenalty;
float fDistance;
int nCritMin = 20;
int nCritMod = 2;
object oNewItem;
float fSnare;
int bReturn = FALSE;
int bFlaming = FALSE;
int bShock = FALSE;
int bFrost = FALSE;
int bHoly = FALSE;
int bUnholy = FALSE;
int bLawful = FALSE;
int bChaotic = FALSE;
int bNeutral = FALSE;
int bSnaring = FALSE;
int bKeen = FALSE;
int bHit;
if(InString(sItemName,"throwing dagger"))
{
fIncrement = FeetToMeters(10.0);
fMaxRange = 5 * fIncrement;
nDamage = d4();
eDamage = EffectDamage(nDamage, DAMAGE_TYPE_PIERCING);
nCritMin = 19;
if (GetHasFeat(FEAT_WEAPON_SPECIALIZATION_DAGGER,oPC))
nDamage = nDamage + 2;
if (GetHasFeat(FEAT_WEAPON_FOCUS_DAGGER,oPC))
nPenalty--;
if (GetHasFeat(FEAT_IMPROVED_CRITICAL_DAGGER,oPC))
nCritMin = nCritMin - 2;
}
if(InString(sItemName,"throwing club"))
{
fIncrement = FeetToMeters(10.0);
fMaxRange = 5 * fIncrement;
nDamage = d6();
eDamage = EffectDamage(nDamage, DAMAGE_TYPE_BLUDGEONING);
if (GetHasFeat(FEAT_WEAPON_SPECIALIZATION_CLUB,oPC))
nDamage = nDamage + 2;
if (GetHasFeat(FEAT_WEAPON_FOCUS_CLUB,oPC))
nPenalty--;
if (GetHasFeat(FEAT_IMPROVED_CRITICAL_CLUB,oPC))
nCritMin--;
}
if(InString(sItemName,"javelin"))
{
fIncrement = FeetToMeters(30.0);
fMaxRange = 5 * fIncrement;
nDamage = d6();
eDamage = EffectDamage(nDamage, DAMAGE_TYPE_PIERCING);
if (GetHasFeat(FEAT_WEAPON_SPECIALIZATION_SPEAR,oPC))
nDamage = nDamage + 2;
if (GetHasFeat(FEAT_WEAPON_FOCUS_SPEAR,oPC))
nPenalty--;
if (GetHasFeat(FEAT_IMPROVED_CRITICAL_SPEAR,oPC))
nCritMin--;
}
if(InString(sItemName,"spear"))
{
fIncrement = FeetToMeters(20.0);
fMaxRange = 5 * fIncrement;
nDamage = d6();
nCritMod = 3;
eDamage = EffectDamage(nDamage, DAMAGE_TYPE_PIERCING);
if (GetHasFeat(FEAT_WEAPON_SPECIALIZATION_SPEAR,oPC))
nDamage = nDamage + 2;
if (GetHasFeat(FEAT_WEAPON_FOCUS_SPEAR,oPC))
nPenalty--;
if (GetHasFeat(FEAT_IMPROVED_CRITICAL_SPEAR,oPC))
nCritMin--;
}
if(InString(sItemName,"throwing hammer"))
{
fIncrement = FeetToMeters(20.0);
fMaxRange = 5 * fIncrement;
nDamage = d6();
eDamage = EffectDamage(nDamage, DAMAGE_TYPE_BLUDGEONING);
if (GetHasFeat(FEAT_WEAPON_SPECIALIZATION_LIGHT_HAMMER,oPC))
nDamage = nDamage + 2;
if (GetHasFeat(FEAT_WEAPON_FOCUS_LIGHT_HAMMER,oPC))
nPenalty--;
if (GetHasFeat(FEAT_IMPROVED_CRITICAL_LIGHT_HAMMER,oPC))
nCritMin--;
}
if(InString(sItemName,"net"))
{
fIncrement = FeetToMeters(10.0);
fMaxRange = 5 * fIncrement;
nDamage = 0;
bSnaring = TRUE;
fSnare = IntToFloat(d20());
}
if(InString(sItemName,"returning"))
bReturn=TRUE;
if(InString(sItemName,"flaming"))
bFlaming=TRUE;
if(InString(sItemName,"shock"))
bShock=TRUE;
if(InString(sItemName,"frost"))
bFrost=TRUE;
if(InString(sItemName,"holy"))
bHoly=TRUE;
if(InString(sItemName,"unholy"))
bUnholy=TRUE;
if(InString(sItemName,"lawful"))
bLawful=TRUE;
if(InString(sItemName,"chaotic"))
bChaotic=TRUE;
if(InString(sItemName,"neutral"))
bNeutral=TRUE;
if(InString(sItemName,"snaring"))
bSnaring=TRUE;
if(InString(sItemName,"keen"))
bKeen=TRUE;
if(GetItemHasItemProperty(oItem,ITEM_PROPERTY_KEEN))
bKeen=TRUE;
if(GetItemHasItemProperty(oItem,ITEM_PROPERTY_BOOMERANG))
bReturn=TRUE;
fDistance = GetDistanceBetween(oPC, oTarget);
if (fDistance > fMaxRange)
{
SendMessageToPC(oPC, "Your Target is Out of Range");
return;
}
nPenalty = nPenalty + (FloatToInt(fDistance / fIncrement) - 1);
if (GetRacialType(oPC) == RACIAL_TYPE_HALFLING)
nPenalty--;
nPenalty = nPenalty - GetAbilityModifier(ABILITY_DEXTERITY, oPC);
int nRoll = d20();
AssignCommand(oPC, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eVisualThrow, oTarget, 0.15));
if (nRoll - nPenalty >= GetAC(oTarget))
bHit = TRUE;
if (bHit == TRUE)
{
switch(Random(3)+1)
{
case 1:
PlayVoiceChat(VOICE_CHAT_PAIN1,oTarget);
break;
case 2:
PlayVoiceChat(VOICE_CHAT_PAIN1,oTarget);
break;
case 3:
PlayVoiceChat(VOICE_CHAT_PAIN3,oTarget); break;
}
oNewItem = CreateItemOnObject(GetTag(oItem), oTarget);
DestroyObject(oItem);
if (bKeen == TRUE)
{
nCritMin = 20 - ( (20 - nCritMin) * 2);
}
if (bReturn == TRUE)
{
AssignCommand(oPC, DelayCommand(1.0,SendMessageToPC(oPC, "Your " + GetName(oNewItem) + " begins to return to you.")));
AssignCommand(oPC, DelayCommand(6.0, CreateEquip(oNewItem, oPC)));
DelayCommand(7.0, DestroyObject(oNewItem));
}
SendMessageToPC(oPC, "Attack Roll: " + IntToString(nRoll) + " Range Penalty: " + IntToString(nPenalty) + " (" + IntToString(nRoll)+"-"+IntToString(nPenalty)+"="+IntToString(nRoll-nPenalty)+ "): Hit");
if (nRoll >= nCritMin)
{
if ( d20()-nPenalty > GetAC(oTarget))
{
SendMessageToPC(oPC, "Critical Hit!");
nDamage = nDamage * (nCritMod);
SendMessageToPC(oPC, "Hit " + GetName(oTarget) + " for " + IntToString(nDamage) + " damage.");
eDamage = EffectLinkEffects(EffectDamage(nDamage),eDamage);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, oTarget);
}
}
else
{
SendMessageToPC(oPC, "Hit " + GetName(oTarget) + " for " + IntToString(nDamage) + " damage.");
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, oTarget);
}
if (bFlaming==TRUE)
nExtraDamage=d6();
eExtraDamage = EffectDamage(nExtraDamage,DAMAGE_TYPE_FIRE);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eExtraDamage, oTarget);
eVisualImpact = EffectVisualEffect(VFX_COM_HIT_FIRE);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisualImpact, oTarget);
SendMessageToPC(oPC, "Additional Damage: " + IntToString(nExtraDamage));
if (bFrost==TRUE)
nExtraDamage=d6();
eExtraDamage = EffectDamage(nExtraDamage,DAMAGE_TYPE_COLD);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eExtraDamage, oTarget);
eVisualImpact = EffectVisualEffect(VFX_COM_HIT_FROST);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisualImpact, oTarget);
SendMessageToPC(oPC, "Additional Damage: " + IntToString(nExtraDamage));
if (bShock==TRUE)
nExtraDamage=d6();
eExtraDamage = EffectDamage(nExtraDamage,DAMAGE_TYPE_ELECTRICAL);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eExtraDamage, oTarget);
eVisualImpact = EffectVisualEffect(VFX_COM_HIT_ELECTRICAL);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisualImpact, oTarget);
SendMessageToPC(oPC, "Additional Damage: " + IntToString(nExtraDamage));
if (bHoly==TRUE && GetAlignmentGoodEvil(oTarget)== ALIGNMENT_EVIL)
nExtraDamage=d6(2);
eExtraDamage = EffectDamage(nExtraDamage,DAMAGE_TYPE_POSITIVE);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eExtraDamage, oTarget);
eVisualImpact = EffectVisualEffect(VFX_COM_HIT_DIVINE);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisualImpact, oTarget);
SendMessageToPC(oPC, "Additional Damage: " + IntToString(nExtraDamage));
if (bUnholy==TRUE && GetAlignmentGoodEvil(oTarget)== ALIGNMENT_GOOD)
nExtraDamage=d6(2);
eExtraDamage = EffectDamage(nExtraDamage,DAMAGE_TYPE_NEGATIVE);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eExtraDamage, oTarget);
eVisualImpact = EffectVisualEffect(VFX_COM_HIT_NEGATIVE);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisualImpact, oTarget);
SendMessageToPC(oPC, "Additional Damage: " + IntToString(nExtraDamage));
if (bLawful==TRUE && GetAlignmentLawChaos(oTarget)== ALIGNMENT_LAWFUL)
nExtraDamage=d6(2);
eExtraDamage = EffectDamage(nExtraDamage,DAMAGE_TYPE_MAGICAL);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eExtraDamage, oTarget);
eVisualImpact = EffectVisualEffect(VFX_COM_HIT_SONIC);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisualImpact, oTarget);
SendMessageToPC(oPC, "Additional Damage: " + IntToString(nExtraDamage));
if (bChaotic==TRUE && GetAlignmentLawChaos(oTarget)== ALIGNMENT_CHAOTIC)
nExtraDamage=d6(2);
eExtraDamage = EffectDamage(nExtraDamage,DAMAGE_TYPE_MAGICAL);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eExtraDamage, oTarget);
eVisualImpact = EffectVisualEffect(VFX_COM_HIT_SONIC);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisualImpact, oTarget);
SendMessageToPC(oPC, "Additional Damage: " + IntToString(nExtraDamage));
if ((bNeutral==TRUE && GetAlignmentLawChaos(oTarget)== ALIGNMENT_NEUTRAL) ||
(bNeutral==TRUE && GetAlignmentGoodEvil(oTarget)== ALIGNMENT_NEUTRAL))
nExtraDamage=d6(2);
eExtraDamage = EffectDamage(nExtraDamage,DAMAGE_TYPE_MAGICAL);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eExtraDamage, oTarget);
eVisualImpact = EffectVisualEffect(VFX_COM_HIT_SONIC);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisualImpact, oTarget);
SendMessageToPC(oPC, "Additional Damage: " + IntToString(nExtraDamage));
if (bSnaring==TRUE)
eExtraDamage = EffectEntangle();
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eExtraDamage, oTarget, fSnare);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_ENTANGLE), oTarget, fSnare);
SendMessageToPC(oPC, GetName(oTarget) + " is entangled in the net!");
}
else
{
oNewItem = CreateObject(OBJECT_TYPE_ITEM, GetTag(oItem), GetLocation(oTarget));
DestroyObject(oItem);
SendMessageToPC(oPC, "Attack Roll: " + IntToString(nRoll) + " Range Penalty: " + IntToString(nPenalty) + " (" + IntToString(nRoll)+"-"+IntToString(nPenalty)+"="+IntToString(nRoll-nPenalty)+"): Miss");
if (bReturn == TRUE)
{
AssignCommand(oPC, DelayCommand(1.0,SendMessageToPC(oPC, "Your " + GetName(oNewItem) + " begins to return to you.")));
AssignCommand(oPC, DelayCommand(6.0, CreateEquip(oNewItem, oPC)));
DelayCommand(7.0, DestroyObject(oNewItem));
}
else
{
SendMessageToPC(oPC, "The " + GetName(oItem) + " skitters across the ground after missing its mark.");
}
}
if(oTarget!=OBJECT_INVALID)
{
AssignCommand(oTarget,ActionAttack(oPC));
}
return;
}
}
Jeggred
PM me with feedback, please
|