//::///////////////////////////////////////////////
//:: do_grenade
//:://////////////////////////////////////////////
/*
USE: player uses a grenade
*/
//:://////////////////////////////////////////////
//:: Created By: The Magus (2012 july 10)
//:: Modified:
//:://////////////////////////////////////////////
#include "x2_inc_switches"
void DoThrowGrenade(object oGrenade, object oTarget, location lTarget, string sScript, int bSplash);
void DoThrowGrenade(object oGrenade, object oTarget, location lTarget, string sScript, int bSplash)
{
int nTargetType = GetObjectType(oTarget);
int bHit;
float fDist = GetDistanceBetweenLocations(GetLocation(OBJECT_SELF),lTarget);
float fPrefDist = StringToFloat(Get2DAString("appearance", "PREFATCKDIST", GetAppearanceType(OBJECT_SELF)))*2.0;
if(GetIsObjectValid(oTarget))
{
int nAttack;
if(fDist<=fPrefDist)
nAttack = TouchAttackMelee(oTarget);
else
nAttack = TouchAttackRanged(oTarget);
if(nAttack)
{
// direct hit
bHit = TRUE;
ExecuteScript(sScript, oTarget);
}
}
if(!bHit)
{
oTarget = GetAreaFromLocation(lTarget);
SetLocalInt(oTarget, "GRENADE_MISS", TRUE);
SetLocalLocation(oTarget, "GRENADE_LOCATION", lTarget);
ExecuteScript(sScript, oTarget);
}
if(bSplash)
{
// potential splash
int nIt;
vector vPos = GetPositionFromLocation(lTarget);
object oBystander = GetFirstObjectInShape(SHAPE_SPHERE, 5.0, lTarget, TRUE, OBJECT_TYPE_CREATURE, vPos);
while(GetIsObjectValid(oBystander))
{
if(oBystander!=oTarget)
{
SetLocalInt(oBystander,"GRENADE_SPLASH", ++nIt);
DelayCommand(0.1, ExecuteScript(sScript, oBystander) );
}
oBystander = GetNextObjectInShape(SHAPE_SPHERE, 5.0, lTarget, TRUE, OBJECT_TYPE_CREATURE, vPos);
}
}
}
// MAIN ----------------------------------------------------------------------------
void main()
{
int nEvent = GetUserDefinedItemEventNumber();
// BEGIN Event Activate
if (nEvent==X2_ITEM_EVENT_ACTIVATE)
{
object oPC = GetItemActivator();
object oGrenade = GetItemActivated();
if(!GetIsObjectValid(oPC)||!GetIsObjectValid(oGrenade))
return;
object oTarget = GetItemActivatedTarget();
location lTarget= GetItemActivatedTargetLocation();
string sScript = GetLocalString(oGrenade,"GRENADE_SCRIPT");
int bSplash = GetLocalInt(oGrenade,"GRENADE_SPLASH");
AssignCommand(oPC, DoThrowGrenade(oGrenade, oTarget, lTarget, sScript, bSplash ));
}
}