90 lines
2.9 KiB
Plaintext
90 lines
2.9 KiB
Plaintext
//::///////////////////////////////////////////////
|
|
//:: Name Things that go boom
|
|
//:: FileName xs_catapult_use
|
|
//:: Copyright (c) 2003 NWNZone.com
|
|
//:://////////////////////////////////////////////
|
|
/*
|
|
This is the on use event for the catapults
|
|
[Version .5a]
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By: Xeno
|
|
//:: Created On: 11 Aug 2003
|
|
//:://////////////////////////////////////////////
|
|
|
|
#include "xs_detonate_loc"
|
|
|
|
int iPCUse=TRUE;//Set TRUE if you want player to use it.
|
|
int iRandFar=40;//How far shall projectile go? 120=12 tiles.
|
|
int iRandNear=15;//What shall it's shortest range be? 10=1 tile.
|
|
int iTurnToFaceTarget=TRUE;//Shall the catapult rotate towards target?
|
|
|
|
//Do not edit below this line.
|
|
void main()
|
|
{
|
|
object oUser = GetLastUsedBy();
|
|
if (GetIsPC(oUser) && iPCUse==FALSE)
|
|
{
|
|
//object oCalapulter = GetNearestObjectByTag("xs_catapulter_01",oUser);
|
|
object oCalapulter = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_NOT_PC);
|
|
FloatingTextStringOnCreature("Get away from that!", oCalapulter);
|
|
return;
|
|
}
|
|
int iReloading = GetLocalInt(OBJECT_SELF,"reloading");
|
|
if(iReloading==TRUE)
|
|
return;
|
|
SetLocalInt(OBJECT_SELF,"reloading",TRUE);
|
|
|
|
//Calc 90 Deg total from facing direction
|
|
float fFacing = GetLocalFloat(OBJECT_SELF,"FACING");
|
|
if(fFacing==0.0)
|
|
{
|
|
fFacing = GetFacing(OBJECT_SELF);
|
|
SetLocalFloat(OBJECT_SELF,"FACING",fFacing);
|
|
}
|
|
float fNewFacing;
|
|
|
|
int iOffSet = Random(45)+1;
|
|
float fOffSet = IntToFloat(iOffSet);
|
|
int sSwing = Random(2);
|
|
//int sSwing=1;
|
|
if (sSwing == 0)
|
|
{
|
|
fNewFacing = fFacing - fOffSet;
|
|
if (fNewFacing<=0.0)
|
|
fNewFacing=(360.0+fNewFacing);
|
|
}
|
|
if(sSwing == 1)
|
|
{
|
|
fNewFacing = fFacing + fOffSet;
|
|
if (fNewFacing>=360.0)
|
|
fNewFacing=(fNewFacing-360.0);
|
|
}
|
|
vector vMyPos = GetPosition(OBJECT_SELF);
|
|
//Calc Rand Distance
|
|
int iRandomDist = Random(iRandFar-iRandNear)+iRandNear;
|
|
float fRandomDist =IntToFloat(iRandomDist);
|
|
vector vNewPos = vMyPos + (fRandomDist * AngleToVector(fNewFacing));
|
|
location lTarget = Location(GetArea(OBJECT_SELF),vNewPos, 0.0);
|
|
float fX_Pos = vNewPos.x;
|
|
float fY_Pos = vNewPos.y;
|
|
//Find new z axis
|
|
object oCheckZ = GetNearestObjectToLocation(OBJECT_TYPE_ALL,lTarget,1);
|
|
vector vNewZCord = GetPosition(oCheckZ);
|
|
float fZ_Pos = vNewZCord.z;
|
|
//Calc new Z axis
|
|
vector vFinalLocation = Vector(fX_Pos,fY_Pos,fZ_Pos);
|
|
location lFinalTarget = Location(GetArea(OBJECT_SELF),vFinalLocation, 0.0);
|
|
//Done
|
|
if(iTurnToFaceTarget==TRUE)
|
|
SetFacingPoint(vFinalLocation);
|
|
//Set explosion delay
|
|
float fRange = GetDistanceBetweenLocations(lTarget, GetLocation(OBJECT_SELF));
|
|
float fDelay = fRange / 12.0;
|
|
//Do stuff
|
|
AssignCommand(OBJECT_SELF, ActionCastFakeSpellAtLocation(SPELL_FIREBALL, lFinalTarget, PROJECTILE_PATH_TYPE_BALLISTIC));
|
|
PlaySound("sim_explsun");
|
|
DelayCommand(fDelay, BlastArea(lFinalTarget));
|
|
DelayCommand(fDelay, SetLocalInt(OBJECT_SELF,"reloading",FALSE));
|
|
}
|